2016-11-20 150 views

回答

8

您可以在两个顶点之间添加边,然后通过使用both()步骤在查询时忽略方向。这是您通常在Gremlin中处理双向边缘的方式。

让我们打开小鬼控制台,并创建一个简单的图形,其中Alice和Bob是朋友:

  \,,,/ 
     (o o) 
-----oOOo-(3)-oOOo----- 
gremlin> graph = TinkerGraph.open() 
gremlin> g = graph.traversal(standard()) 
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard] 
gremlin> 
==>null 
gremlin> g.addV(label, 'user', 'name', 'Alice').as('alice').addV(label, 'user', 'name', 'Bob').as('bob').addE('friendWith').from('alice').to('bob') 
==>e[4][0-friendWith->2] 

这两个顶点和一条边创建一个图表:

gremlin> g.V() 
==>v[0] 
==>v[2] 
gremlin> g.E() 
==>e[4][0-friendWith->2] 

注意你怎么能不在出口方向上从Bob顶点到Alice顶点进行遍历,但可以沿着输入方向进行遍历(第一个查询不会产生结果)。

gremlin> g.V().has('name', 'Bob').out('friendWith') 
gremlin> g.V().has('name', 'Bob').in('friendWith') 
==>v[0] 

或者从Alice开始(第二查询产生无结果),你会得到相反的:

gremlin> g.V().has('name', 'Alice').out('friendWith') 
==>v[2] 
gremlin> g.V().has('name', 'Alice').in('friendWith') 

但是,您可以遍历与both()步两个方向的图,并获取Alice的朋友或鲍勃的朋友。

gremlin> g.V().has('name', 'Alice').both('friendWith') 
==>v[2] 
gremlin> g.V().has('name', 'Bob').both('friendWith') 
==>v[0] 

这也适用于具有两个以上顶点和一个友谊关系的更复杂的图。在尝试遍历相邻顶点时,步骤简单地忽略了边的方向。

相关问题