Gremlin Azure Cosmos graphSON复杂对象

时间:2018-07-22 04:05:23

标签: azure-cosmosdb gremlin

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

我下面的语法将与gremlin.net一起使用gremlin语法访问cosmos db-因此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格式可行吗?
尝试拉回数据时,我是否以错误的方式思考? 这是我对graphDB所做的不同寻常的事情,因为我很难找到这种类型的具有多个级别的单对多关系来创建复杂的对象。

1 个答案:

答案 0 :(得分:2)

在询问有关Gremlin的问题时,最好总是包括一个简短的Gremlin脚本,该脚本可以创建一些示例数据,因为它使回答的人难以置信地轻松地进行了精确/经过测试的遍历,可以解决您的问题({{3 }}。

对于您的问题,您绝对可以以所需的任何形式返回数据。在example上的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())