本文介绍了使用`as`和`selt`遍历JanusGraph Gremlin图提供了意外结果的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有两次图形遍历,结果如下:
g.V().has("id", 2).outE("knows").inV()
==>v[4216]
==>v[8312]
g.V().has("id", 5).outE("knows").inV()
==>v[4216]
==>v[8312]
基本上,id为2
和5
的两个顶点都有到另外两个相同顶点v[4216]
和v[8312]
的边。
现在,如果我链接上面的两个查询并标记它们,然后选择第一个查询,结果不会像预期的那样。
g.V().has("id", 2).outE("knows").inV().dedup().as('a').V().has('id', 5).outE('knows').inV().dedup().as('b').select('a')
==>v[4216]
==>v[4216]
我预计因为我只选择a
,所以结果应该与执行第一次图遍历相同,应该返回v[4216]
和v[8312]
。
您知道什么可能是问题吗?
JanusGraph版本为0.5.3
,TinkerPOP为3.4.6
推荐答案
这实际上工作正常。第二个dedup
是删除承载其他顶点的遍历。还请注意,您的第二个V
会导致一些额外的扇出查询。这里有一个例子,我希望能把它说清楚。
使用此图表:
g.addV('a').as('a').
addV('b').as('b').
addV('c').as('c').
addV('d').as('d').
addE('knows').from('a').to('c').
addE('knows').from('a').to('d').
addE('knows').from('b').to('c').
addE('knows').from('b').to('d')
我们可以检查查询的流程:
第二个dedup
gremlin> g.V().hasLabel('a').outE("knows").inV().dedup().as('a').V().hasLabel('b').outE('knows').inV().dedup().as('b').select('
a').label()
==>c
==>c
没有第二个dedup
gremlin> g.V().hasLabel('a').outE("knows").inV().dedup().as('a').V().hasLabel('b').outE('knows').inV().as('b').select('a').labe
l()
==>c
==>c
==>d
==>d
使用path
步骤可以查看到底发生了什么
gremlin> g.V().hasLabel('a').outE("knows").inV().dedup().as('a').V().hasLabel('b').outE('knows').inV().dedup().as('b').select('
a').path()
==>[v[0],e[4][0-knows->2],v[2],v[1],e[6][1-knows->2],v[2],v[2]]
==>[v[0],e[4][0-knows->2],v[2],v[1],e[7][1-knows->3],v[3],v[2]]
gremlin> g.V().hasLabel('a').outE("knows").inV().dedup().as('a').V().hasLabel('b').outE('knows').inV().as('b').select('a').path
()
==>[v[0],e[4][0-knows->2],v[2],v[1],e[6][1-knows->2],v[2],v[2]]
==>[v[0],e[4][0-knows->2],v[2],v[1],e[7][1-knows->3],v[3],v[2]]
==>[v[0],e[5][0-knows->3],v[3],v[1],e[6][1-knows->2],v[2],v[3]]
==>[v[0],e[5][0-knows->3],v[3],v[1],e[7][1-knows->3],v[3],v[3]]
以下是相同的查询,但只显示了结果中显示的标签。
gremlin> g.V().hasLabel('a').outE("knows").inV().dedup().as('a').V().hasLabel('b').outE('knows').inV().dedup().as('b').select('
a').path().by(label)
==>[a,knows,c,b,knows,c,c]
==>[a,knows,c,b,knows,d,c]
gremlin> g.V().hasLabel('a').outE("knows").inV().dedup().as('a').V().hasLabel('b').outE('knows').inV().as('b').select('a').path
().by(label)
==>[a,knows,c,b,knows,c,c]
==>[a,knows,c,b,knows,d,c]
==>[a,knows,d,b,knows,c,d]
==>[a,knows,d,b,knows,d,d]
这篇关于使用`as`和`selt`遍历JanusGraph Gremlin图提供了意外结果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!