我试图基于匹配每个顶点中的属性值在顶点之间创建边,从而将当前的隐含关系变成显式关系。我编写与相关顶点匹配的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
的一条边,而是从carol
到dave
的另一边,alice
和bob
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
并分别创建边?
答案 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()
的调用是否会被任何图形优化。虽然使用此表单很方便,但您可能会发现采用确保使用索引的方法更快,这可能意味着发出多个查询来解决问题。