在CosmosDB中将顶点存储为JSON

mik*_*aub 5 azure graph-databases gremlin azure-cosmosdb

我见过的所有使用gremlin API查询CosmosDB图的例子都使用具有一级属性的顶点.但是,如果我们想将顶点表示为JSON文档呢?

user.name = "Mike"
user.location.lat = "37.7749"
user.location.lng = "122.4194"
Run Code Online (Sandbox Code Playgroud)

有时,嵌套属性应该作为单独的顶点拆分并通过边链接,但通常这是不必要的.

推荐的方法是什么?应该只有一个适配器类在进入和离开数据库时展平/取消平顶顶点?这似乎很简单,但在性能方面却非常昂贵.

Oli*_*ers 4

有一种使用 Gremlin API 编写嵌套属性的方法,并且 Cosmos DB 支持。但是,此模式的架构要求不会按照您所描述的方式映射到 JSON 文档格式。

Gremlin 顶点属性的每个键可以有多个值,每个值也可以有多个元属性(也称为嵌套属性)。

我建议阅读有关 Vertex Properties 的 Tinkerpop 参考

以下是如何通过 gremlin 将嵌套属性添加到顶点属性:

g.V('vertex_id').property('name', 'marko') // (1)
g.V('vertex_id').properties('name').hasValue('marko').property('metaprop', 'value') // (2)
Run Code Online (Sandbox Code Playgroud)

(1) - 添加顶点属性 ('name', 'marko) (2) - 在 ('name', 'marko) 属性上添加嵌套属性

以下是将使用顶点属性架构存储在 CosmosDB 中的 json 文档示例:

{
  id: <ID>,
  label: 'person',
  name: [{
    id: <ID>,
    _value: 'marko',
    _meta : {
      metaprop: 'value'
    }
  }],
  address: [
    {
      id: <ID>,
      _value: 'street 1',
      _meta: {
        type: 'street',
        somethingElse: 'value'
      }
    },
    {
      id: <ID>,
      _value: 'new york',
      _meta: {
        type: 'city',
        anotherMeta: 'something'
      }
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

  • 澄清一下:如果您的目标是将原始 JSON 摄取到 CosmosDB 图形顶点中,那么您是对的,并且当前的支持将要求您使数据模型适应 Gremlin 顶点结构。您有可以分享的 JSON 文档示例/样本吗?我们的目标是支持一种格式,使使用 Gremlin 编写/读取 JSON 变得更容易/更流畅,并避免特定的架构要求。这项工作正在进行中,我们将在未来提供更多详细信息。 (2认同)