【问题标题】:Gremlin Azure Cosmos graphSON Complex ObjectGremlin Azure Cosmos graphSON 复杂对象
【发布时间】:2018-07-22 04:05:23
【问题描述】:

当您的顶点组合起来创建一个复杂对象时,我很难理解以 gremlin 语法返回数据的方式。

我下面的语法将采用与 gremlin.net 一起用于访问 cosmos db 的 gremlin 语法 - 因此 graphSON 通过 cosmos 返回,然后我的 POCO 对象采用 C# 语法。

假设我有一个更像一棵树的示例,其中所有内容都是相关的,但我不想要重复的数据。所以,如果我有一个财产 - 就像一个apt。你有属性顶点,房间顶点,人物顶点。如果我在做一个标准的 C# POCO,它可能看起来像这样:

public class Property{
   public List<Room> Rooms {get;set;}
   public List<Person> Managers {get;set;}
   //additional general properties of the property - name, address, etc
}

public class Room {
   public List<Person> Tenants {get;set;}
   //other room properties - number, size, etc
}

public class Person{
    //general properties - name, age, gender, etc
}

所以我一直在尝试在 graphSON 语法中复制该结构,但是一旦我降低了一个级别,它似乎并没有真正做到这一点 - 至少我还没有找到任何示例。我期待能够让 graphSON 在返回时看起来更像这样:

"property":{
   "basic":{
      //the property vertex
    },
    "managers":[ //array of managers
       "manager":{
          //person vertex
       }
    ],
   "rooms":[ //array of rooms
        "room":{
          //a room vertex
         },
        "tenants":[
          {
            "tenant":{
               //person vertex
            }
          }
        ]
    ]
}

另一个警告是,通常我可能希望返回某些属性或仅返回部分而不是整个顶点 - 所以很可能是 valueMap 或类似的东西。
我已经尝试过各种方式的sideEffects、flatMap、maps、local,看看我是否能得到它,但它似乎总是很快就崩溃了。

如果我这样打电话:

g.V('my-key').as('property').flatmap(out('a-room')).as('r').select('property','r')

我会得到更多类似的东西作为回报:

[
  {
    "property":{} //property vertex
    "r":{}//a room vertex
  },
  {
    "property":{} //property vertex
    "r":{}//a room vertex
  },
  //repeat until you have all rooms
]

这会导致返回大量额外数据,因为我只需要一次属性信息。

g.V('my-key').as('p').local(out('a-room').fold()).as('r').unfold().local(out('a-tenant').fold()).as('t').select('p','r','t')

这会再次导致重复数据并使所有内容都保持在一个级别而不是子级别。

所以我的问题是: 我提出的graphSON格式可行吗?
尝试拉回数据时我的想法是否错误? 我对graphDBs 所做的事情并不常见,因为我很难找到这种类型的具有多层次的单到多关系来创建复杂的对象。

【问题讨论】:

    标签: azure-cosmosdb gremlin


    【解决方案1】:

    在询问有关 Gremlin 的问题时,最好包含一个简短的 Gremlin 脚本,该脚本可以创建一些示例数据,因为它使回答者非常容易为您提供可以解决您的问题的准确/经过测试的遍历 (example )。

    至于您的问题,您绝对可以以您需要的任何形式返回数据。在Collections 上的 TinkerPop 文档中阅读此配方可能会有所帮助。在你的情况下,我认为你只需要一个嵌套的 project() 遍历类型:

    g.V("my-key").
      project('name','address', 'rooms')
        by('name').
        by('address').
        by(out('a-room').
           project('number','size','tenantCount')
             by('number').
             by('size').
             by(out('a-tenant').count()).
           fold())
    

    【讨论】:

    • 非常感谢!在这种情况下看到它确实有助于我更好地理解项目以及如何使用它。下次我将确保为示例数据包含一个脚本。感谢您的帮助以及收藏文档的链接。
    猜你喜欢
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多