使用gremlinpython以GraphSON格式将Graph Vertex直接添加到CosmosDB

时间:2018-06-04 21:55:41

标签: python json azure-cosmosdb gremlin graphson

我使用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对象或查询之间进行转换的任何文档。

2 个答案:

答案 0 :(得分:3)

Gremlin中根本没有这样的API。它没有可以接受GraphSON或Dictionary(Java中为Map)的步骤,可以将其本地转换为property()步骤。多年来,TinkerPop社区对此主题进行了大量讨论,因为这样一个步骤的用户便利性可以说是高的,特别是在您描述的上下文中。不幸的是,引入Map并不适合API,因为它最初会显示,因为它不能正确设置多属性,除非步骤签名接受Map<Object,List<Object>>(即在Python中,密钥为DictionaryString且值为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 IPart IIPart 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中进行了测试。