【问题标题】:Using Azure CosmosDB DocumentDB API with Graph API将 Azure CosmosDB DocumentDB API 与图形 API 结合使用
【发布时间】:2017-06-28 20:41:44
【问题描述】:

我想做的事:

  • 将无模式 JSON 保存到文档中
  • 任意连接那些文档
  • 根据上述连接获取文档的递归树,例如:
{
    "name": "Document 1",
    "includes": [
        {
            "name": "Document 2.1"
            "includes": [
                {
                    "name": "Document 3",
                    "includes": []
                }
            ]
        },
        {
            "name": "Document 2.2",
            "includes": []
        }
    ]
}

我的设置的当前状态:

  • 配置了 Graph (Gremlin) API 的 CosmosDB 实例
  • 可以通过 DocumentDB API 创建 (JSON) 文档
  • 可以通过 Graph API 为文档创建边
  • 使用 Node.js SDK

问题:

  1. 是否可以通过 Graph API 将 JSON 对象保存为顶点?它允许使用g.addV('person').property('id', 'thomas').property('firstName', 'Thomas').property('age', 44).property('userid', 1) 创建顶点,但g.addV({ firstName: 'Thomas' }) 之类的东西似乎不起作用。

  2. 如果我通过 DocumentDB API 添加文档并通过 Graph API 添加它们之间的边并遍历图形,结果仅包括文档的 ID,而不包括其他属性。是否可以以某种方式填充文档?

遍历查询示例:

g.V('03e0576f-2ff7-6109-5ed5-237b43191354').repeat(out('includes')).until(not(out('includes'))).simplePath().dedup().tree().by('id')

此查询的结果:

[{
    "03e0576f-2ff7-6109-5ed5-237b43191354": {
        "key": "03e0576f-2ff7-6109-5ed5-237b43191354",
        "value": {
            "7fab4007-c80c-ba21-f5d3-8eb353ea3279": {
                "key": "7fab4007-c80c-ba21-f5d3-8eb353ea3279",
                "value": {
                    "eec55fbd-6900-130d-247f-fb437b093711": {
                        "key": "eec55fbd-6900-130d-247f-fb437b093711",
                        "value": {}
                    },
                    "cfd14a8c-1ac3-6cc3-e2a4-ac3f250478e1": {
                        "key": "cfd14a8c-1ac3-6cc3-e2a4-ac3f250478e1",
                        "value": {
                            "acac136a-3bd4-831c-df6e-e5b95e593b9a": {
                                "key": "acac136a-3bd4-831c-df6e-e5b95e593b9a",
                                "value": {}
                            }
                        }
                    }
                }
            }
        }
    }
}]

【问题讨论】:

    标签: node.js azure azure-cosmosdb gremlin


    【解决方案1】:

    是的,可以通过 Graph API 和 Document API 插入文档。但是,Cosmos 期望文档具有特定的 GraphSON 格式,以便在图遍历期间获取它们的所有属性。

    我建议您同时查看 Tinkerpop 文档中的 Vertex PropertiesGraphSON,以便更好地了解这些主题。

    当通过 Gremlin 添加文档时,语法是名称值逗号分隔您要添加的所有属性。试试这个:

    g.addV('label', 'human', 'name', 'jesse', 'age', 27)
    

    现在,如果您转到 Azure 门户并执行 SQL 查询 SELECT * FROM c,您将能够看到 Cosmos 将您的文档翻译成的格式。

    【讨论】:

    • 谢谢!明白了(大部分)现在可以工作了 :) 想到了一件事:通过createDocument 保存文档并且无法弄清楚如何保存嵌套数据(我猜这些在 Gremlin 中被称为元属性)。尝试保存 this 之类的文档,并在使用 Gremlin 查询时,地址具有两个值,但我需要某种标签字段来区分它们。
    • Cosmos 确实支持添加元属性。我已经更新了您的要点,以包含 Cosmos 在通过文档 API gist.github.com/WonderPanda/a5c1df4df55d431eeb26eb97d4913aa1 附加元属性时所期望的格式。
    • 您也可以考虑将不同属性的 ID 设置为对人类友好的值,但如果您需要嵌套多个元属性,请参考我的要点
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多