Gremlin:你如何在没有特定边缘的情况下找到顶点?

时间:2014-04-03 12:01:22

标签: graph gremlin vertices edges

我一直在看Gremlin图语言,看起来非常强大。然而,在完成了根据要求对其进行评估的过程中,我遇到了一个我似乎无法完成的案例。

假设Gremlin已启动,并使用其示例数据库:

gremlin> g = TinkerGraphFactory.createTinkerGraph()
...
gremlin> g.V.out('knows')
==>v[2]
==>v[4]

因此,这显示了具有“已知”边缘的顶点。

但是,我想找到具有'knows'边缘的顶点。类似的东西:

gremlin> g.V.outNot('knows')
==>v[3]
==>v[5]
==>v[6]

如何找到这些顶点?

(已编辑以使输出正确)

3 个答案:

答案 0 :(得分:4)

我用几种方式解释这个问题,但也许这就是你所追求的。一种方法是:

gremlin> g = TinkerGraphFactory.createTinkerGraph()    
==>tinkergraph[vertices:6 edges:6]
gremlin> g.V.outE.hasNot('label','knows')
==>e[9][1-created->3]
==>e[12][6-created->3]
==>e[10][4-created->5]
==>e[11][4-created->3]
gremlin> g.V.outE.hasNot('label','knows').inV
==>v[3]
==>v[3]
==>v[5]
==>v[3]

请注意,label和id都被识别为属性:

gremlin> g.V.has('id',"1")
==>v[1]
gremlin> g.E.map("label","id")
==>{id=10, label=created}
==>{id=7, label=knows}
==>{id=9, label=created}
==>{id=8, label=knows}
==>{id=11, label=created}
==>{id=12, label=created}

另一种考虑这个问题的方法是找到一个没有"知道"的顶点列表。边缘:

gremlin> g.V.filter{!it.bothE('knows').hasNext()}    
==>v[3]
==>v[6]
==>v[5]

答案 1 :(得分:0)

我正在使用gremlin而不是orientdb,这对我有用;只需在边缘标签前加上'out _'

g.V.hasNot('out_knows');

答案 2 :(得分:0)

如果您正在寻找 Groovy 语法(例如,AWS Neptune 可以将其与笔记本一起使用)。您可以像这样构建查询

g.V().not(outE('filtered_relationship'))