我使用gremlinpython连接到CosmosDB图,并希望能够使用GraphSON格式的字典直接添加顶点。具体来说,我想避免动态构建gremlin查询,例如:
"g.addV('person').property(...)..."
而是运行类似:
my_dict = {'id':'something', 'label':'person', 'outE':{}, 'properties':{}}
_gremlin_insert_vertex = "g.addV('person').use_my_graphson_dict({})".format(my_dict)
callback = client.submitAsync(_gremlin_insert_vertex)
或者那种效果。 Azure门户具有来自我运行的查询(例如"g.V()"
)的顶点的JSON表示,但我希望能够使用gremlinpython将其转换为Python,进行更新,然后将JSON dict发送回更新或添加一个顶点。我似乎无法找到有关如何在GraphSON dict和gremlin对象或查询之间进行转换的任何文档。
答案 0 :(得分:3)
Gremlin中根本没有这样的API。它没有可以接受GraphSON或Dictionary
(Java中为Map
)的步骤,可以将其本地转换为property()
步骤。多年来,TinkerPop社区对此主题进行了大量讨论,因为这样一个步骤的用户便利性可以说是高的,特别是在您描述的上下文中。不幸的是,引入Map
并不适合API,因为它最初会显示,因为它不能正确设置多属性,除非步骤签名接受Map<Object,List<Object>>
(即在Python中,密钥为Dictionary
或String
且值为T
任意对象的List
,其构造和推理更为复杂。此外,当在如何设置这些属性的一般上下文中考虑时,该API不能很好地考虑元属性。还有其他反对它的论点,但那些往往会在我脑海中突显出来。
至于接受GraphSON本身的步骤(我想这会减轻我上面提到的多/元属性的一些问题),我认为从未提出过。我不确定它是如何工作的,因为GraphSON是IO操作的一个功能,而Gremlin语言本身根本就没有任何相关知识。 IO是一个远离Gremlin的抽象,我不知道它会适合那里。我还认为大多数用户抱怨GraphSON的复杂性(带有嵌入式列表或列表的字典等),并且手动构建GraphSON并非易事,因此我怀疑很多人会发现这样的API对他们很有吸引力。多元/元属性再次出现! :)
我还说TinkerPop非常反对构建Gremlin的字符串。你现在不得不在CosmosDB中这样做,因为他们还不支持字节码API。有了这种支持(他们正在努力),你将不再将Gremlin作为String
值提交,而是用你最喜欢的母语(在你的情况下Python)写Gremlin。因此,可能不鼓励开发进一步鼓励用户“构造字符串”的路径,包括GraphSON或Gremlin。
现在,在Python中,你可以自己构建这个方法作为自定义Gremlin DSL的一部分,它基本上需要Dictionary
并将其转换为property()
个调用。由于逻辑将特定于您的应用程序,您可以考虑您可能或可能没有的任何元/多属性问题。您可以阅读有关如何构建DSL here的更多信息,并详细了解在此博客文章系列中实施的模式:Part I,Part II和Part III。
我认为,当有越来越多的人支持放弃对多元/元属性的支持时,我们可能会在4.x中看到这种原生于Gremlin的API,但在此之前并没有很多好主意。
答案 1 :(得分:0)
这已经晚了一年,所以现在您已经解决了这个问题,或者不再关心,而是为了后代...
您可以对图集合使用sql python客户端,并使用insert document方法发送一个具有有效Graphson结构的json顶点:
类似这样的东西:
{
"label": "person",
"firstName": [{
"_value": "Thomas",
"id": "5267ec4b-a39e-4d77-8dea-668cb36307bc"
}],
"lastName": [{
"_value": "Andersen",
"id": "2e5271a6-ddd8-48b9-8ff6-be41e19f82f8"
}],
"age": [{
"_value": 44,
"id": "1c9a57cc-3324-4a0c-b4c3-d494fbb3fb81"
}],
"PartitionKey": "123",
"id": "a9b57684-16bf-47d9-8761-570bab43ca7b"
}
前一段时间我已经blogged了-虽然我只是在.NET SDK中进行了测试。