使用 gremlinpython 以 GraphSON 格式将图形顶点直接添加到 CosmosDB

Adding a Graph Vertex directly to CosmosDB in GraphSON format using gremlinpython

我正在使用 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 门户有一个 JSON 表示来自查询 I 运行(例如 "g.V()")的顶点,但我希望能够使用 gremlinpython 将其放入 Python,进行更新,然后将 JSON 字典发回以更新或添加顶点。我似乎找不到任何关于如何在 GraphSON dict 和 gremlin 对象或查询之间进行转换的文档。

Gremlin 中根本没有这样的 API。它没有可以接受 GraphSON 的步骤或 Dictionary(Java 中的 Map)将其本地转换为 property() 步骤。多年来,在 TinkerPop 社区中就此主题进行了大量讨论,因为这样一个步骤的用户便利性可以说很高,尤其是在您描述的上下文中。不幸的是,引入 Map 并不适合 API,因为它最初看起来是因为它不允许设置多属性,除非步骤签名接受 Map<Object,List<Object>>(即在 Python 中,Dictionary,其中键是 StringT,值是任意对象的 List),构造和推理更复杂关于。此外,在设置元属性的一般上下文中,API 不能很好地说明元属性。还有其他反对它的论点,但那些往往会在我脑海中浮现。

至于接受 GraphSON 本身的步骤(我想这会缓解我上面提到的 multi/meta-properties 的一些问题),我认为从来没有人提出过。不过,我不确定它是如何工作的,因为 GraphSON 是 IO 操作的函数,而 Gremlin 语言本身根本不知道这一点。 IO 是一个远离 Gremlin 的抽象概念,我不知道它是否适合那里。我还认为大多数用户抱怨 GraphSON 的复杂性(带有嵌入式列表或列表的字典等)并且手动构建 GraphSON 是非常重要的,因此我怀疑很多人会发现这样的 API 有吸引力他们。 Multi/meta-properties再次出击! :)

我还要说 TinkerPop 非常反对构造 Gremlin 字符串。你现在被迫在 CosmosDB 中这样做,因为它们还不支持字节码 API。有了这种支持(他们正在努力),您将不再将 Gremlin 作为 String 值提交,而是用您最喜欢的母语编写 Gremlin(在您的情况下为 Python)。因此,可能不鼓励开发进一步鼓励用户使用任何类型的 "construct strings" 的路径,GraphSON 或 Gremlin。

现在,在 Python 中,您可以自己构建此方法作为自定义 Gremlin DSL 的一部分,它基本上需要 Dictionary 并将其转换为 property() 调用。由于逻辑将特定于您的应用程序,因此您可以考虑您可能遇到或可能没有的任何 meta/multi-property 问题。您可以阅读有关如何构建 DSL 的更多信息 here and learn more about patterns for implementing in this blog post series: Part I, Part II, and Part III

我想我们可能会在 4.x 中看到这种 API 原生于 Gremlin 的东西,因为人们越来越倾向于放弃对 multi/meta-properties 的支持,但在那之前还没有许多好主意。

这已经晚了一年所以现在你要么已经解决了它要么不再关心但是为了后代...

您可以针对您的图形集合使用 sql python 客户端,并使用插入文档方法发送具有顶点有效 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 中测试过它。