我使用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发回更新或添加一个顶点。我似乎找不到任何关于如何在GraphSON dict和gremlin对象或查询之间进行转换的文档。
发布于 2018-06-05 10:26:43
Gremlin中根本没有这样的API。它没有一个可以接受GraphSON或Dictionary (Map in Java)的步骤来将其本机转换为property()步骤。多年来,TinkerPop社区对这一主题进行了大量讨论,因为这样一步的用户方便程度可以说是很高的,特别是在您描述的上下文中。不幸的是,引入Map并不能很好地适应API,因为它一开始就不允许设置多属性,除非步骤签名接受了Map<Object,List<Object>> (即在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的一部分,它基本上接受Dictionary并将其转换为property()调用。由于逻辑是特定于您的应用程序,您可以考虑任何元/多属性问题,您可能有,也可能没有。您可以阅读有关如何构建DSL 这里的更多信息,并在本博客文章系列文章中了解更多有关实现模式的信息:第一部分、第二部分和第三部分。
我认为,我们可能会在4.x中看到这种原生于Gremlin的API,当时人们越来越倾向于放弃对多/元属性的支持,但在那之前,还没有多少好的想法。
发布于 2019-07-28 22:10:37
这已经晚了一年了,所以现在你要么已经解决了,要么已经不在乎了,但为了子孙后代.
您可以对图形集合使用sql客户端,并使用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"
}不久前,我已经对它进行了博客测试--不过我只在.NET SDK中测试过它。
https://stackoverflow.com/questions/50689308
复制相似问题