通过属性匹配遍历隐含边缘?

时间:2019-03-04 21:34:47

标签: gremlin

我试图基于匹配每个顶点中的属性值在顶点之间创建边,从而将当前的隐含关系变成显式关系。我编写与相关顶点匹配的gremlin遍历并没有成功。

具体来说,如下图所示:

works!!
/home/braulio/projetos/github/redtench/src/node/dist/redmine/redmine.js:14
                this.synchronizeAll();
                     ^

TypeError: this.synchronizeAll is not a function

我希望可以使用以下内容创建一个g = TinkerGraph.open().traversal() g.addV('person').property('name','alice') g.addV('person').property('name','bob').property('spouse','carol') g.addV('person').property('name','carol') g.addV('person').property('name','dave').property('spouse', 'alice') 关系

spouse_of

但不是创建从> g.V().has('spouse').as('x') .V().has('name', select('x').by('spouse')) .addE('spouse_of').from('x') bob的一条边,而是从caroldave的另一边,alicebob dave边到所有所有个顶点(包括它们自身):

spouse_of

几乎好像没有应用> g.V().out('spouse_of').path().by('name') ==>[bob,alice] ==>[bob,bob] ==>[bob,carol] ==>[bob,dave] ==>[dave,carol] ==>[dave,dave] ==>[dave,alice] ==>[dave,bob] 过滤器,或者使用RDBMS术语,好像我以“外部联接”而不是“内部联接”结尾d。

有什么建议吗?我是否忽略了一些琐碎或深刻的事情(也许是本地还是全球)?是否有任何方法在单个遍历查询中完成此操作,还是我必须遍历has并分别创建边?

1 个答案:

答案 0 :(得分:1)

您可以一次遍历,但是has()并不意味着那样。在Gremlin Recipes教程的Traversal Induced Values部分中介绍了这种遍历的模式,但是您可以在这里看到它的作用:

gremlin> g.V().hasLabel('person').has('spouse').as('s').
......1>   V().hasLabel('person').as('x').
......2>   where('x', eq('s')).
......3>     by('name').
......4>     by('spouse').
......5>   addE('spouse_of').from('s').to('x')
==>e[10][2-spouse_of->5]
==>e[11][7-spouse_of->0]
gremlin> g.E().project('x','y').by(outV().values('name')).by(inV().values('name'))
==>[x:bob,y:carol]
==>[x:dave,y:alice]

尽管这可以在单个遍历中完成,但请注意,根据数据的大小,遍历可能会很昂贵,因为我不确定对V()的调用是否会被任何图形优化。虽然使用此表单很方便,但您可能会发现采用确保使用索引的方法更快,这可能意味着发出多个查询来解决问题。