Graph 小精灵:如何找到没有特定边的顶点?

Graph 小精灵:如何找到没有特定边的顶点?,graph,gremlin,vertices,edges,Graph,Gremlin,Vertices,Edges,我一直在研究Gremlin图形语言,它看起来非常强大。然而,在运行it如何根据需求评估it的过程中,我遇到了一个似乎无法完成的案例 假设Gremlin已启动,并使用其示例数据库: gremlin> g = TinkerGraphFactory.createTinkerGraph() ... gremlin> g.V.out('knows') ==>v[2] ==>v[4] 这显示了边为“knows”的顶点 但是,我希望找到没有边为“knows”的顶点。比如: greml

我一直在研究Gremlin图形语言,它看起来非常强大。然而,在运行it如何根据需求评估it的过程中,我遇到了一个似乎无法完成的案例

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

gremlin> g = TinkerGraphFactory.createTinkerGraph()
...
gremlin> g.V.out('knows')
==>v[2]
==>v[4]
这显示了边为“knows”的顶点

但是,我希望找到没有边为“knows”的顶点。比如:

gremlin> g.V.outNot('knows')
==>v[3]
==>v[5]
==>v[6]
如何找到这些顶点


(编辑以使输出正确)

我用几种方法解释了这个问题,但也许这就是你想要的。一种方法是:

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]
请注意,标签和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 over orientdb,这对我来说很有用;只需在边缘标签前面加上“out”

g.V.hasNot('out_knows');

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

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

谢谢,这里的教训是边上的“属性”是“标签”,因此可以与hasNot()等一起使用。但这并没有完全回到顶点没有标记为“knows”的边的情况,即返回顶点1、3、5和6的表达式……是的,基本上边标签被识别为属性,因此可以正确地处理has()/hasNot操作。元素id也是如此。在我的回答中包括了其他示例来演示。好吧,但这仍然不能解决问题,让我重新措辞。您拥有的解决方案会过滤存在的关系(边)。“hasNot(…)”返回不是“knows”的顶点(或边)。但是我想要的是缺少边,而不是过滤现有边。所以我想要“notOut()”-这有意义吗?抱歉,如果我仍然没有跟上。你是说你想找到没有“知道”边的顶点吗?如果是,请参阅我的更新答案。顺便说一句,我认为你问题中的例子是错误的,因为v[1]有一个“知道”的边缘。你可以做
outE()。而不是(hasLabel('knows'))
g.V().not(outE('filtered_relationship'))