【发布时间】: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 所做的事情并不常见,因为我很难找到这种类型的具有多层次的单到多关系来创建复杂的对象。
【问题讨论】: