使用`as`和`selt`遍历JanusGraph Gremlin图提供了意外结果 [英] JanusGraph Gremlin graph traversal with `as` and `select` provides unexpected result

查看:15
本文介绍了使用`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为25的两个顶点都有到另外两个相同顶点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图提供了意外结果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆