Gremlin 重复数据消除作为最短路径工作?还有别的选择吗?

Gremlin 重复数据消除作为最短路径工作?还有别的选择吗?,gremlin,Gremlin,样本数据:TinkerPop Modern (ID与我的结果不匹配,但您可以跳过ID) 目标: 查找以某种方式(输入或输出)连接到Marko的所有软件的遍历次数限制 查询1:无重复数据消除 g.V().hasLabel("Person").has("name", "Marko").as("from") .repeat(both().as("to").simplePath().barrier()) .emit(loops().is(lt(4)).and().hasLabel("Softwa

样本数据:TinkerPop Modern (ID与我的结果不匹配,但您可以跳过ID)


目标: 查找以某种方式(输入或输出)连接到Marko的所有软件的遍历次数限制

查询1:无重复数据消除

g.V().hasLabel("Person").has("name", "Marko").as("from") 
.repeat(both().as("to").simplePath().barrier()) 
.emit(loops().is(lt(4)).and().hasLabel("Software")) .path().as("p") 
.select("from", "to").by("name").as("data") .select("p", "data")
查询1的结果:

{'p': [v[10224], v[10220]], 'data': {'from': 'Marko', 'to': 'lop'}}
{'p': [v[10224], v[10226], v[10220]], 'data': {'from': 'Marko', 'to': 'lop'}}
{'p': [v[10224], v[10226], v[10222]], 'data': {'from': 'Marko', 'to': 'ripple'}}
{'p': [v[10224], v[10220], v[10226], v[10222]], 'data': {'from': 'Marko', 'to': 'ripple'}}
查询2:使用重复数据消除

g.V().hasLabel("Person").has("name", "Marko").as("from")
.repeat(both().as("to").simplePath().barrier())
.emit(loops().is(lt(4)).and().hasLabel("Software"))
.dedup("from", "to")
.path().as("p")
.select("from", "to").by("name").as("data")
.select("p", "data")
查询2的结果:

{'p': [v[10224], v[10220]], 'data': {'from': 'Marko', 'to': 'lop'}}
{'p': [v[10224], v[10226], v[10222]], 'data': {'from': 'Marko', 'to': 'ripple'}}

问题

{'p': [v[10224], v[10220]], 'data': {'from': 'Marko', 'to': 'lop'}}
{'p': [v[10224], v[10226], v[10220]], 'data': {'from': 'Marko', 'to': 'lop'}}
{'p': [v[10224], v[10226], v[10222]], 'data': {'from': 'Marko', 'to': 'ripple'}}
{'p': [v[10224], v[10220], v[10226], v[10222]], 'data': {'from': 'Marko', 'to': 'ripple'}}
  • .重复数据消除(“从”、“到”)似乎正在执行查找两个路径之间最短路径的操作
  • 有没有更好的方法来执行最短路径?我试着做极限(1),但可能我没有正确地使用它
  • 如果我不使用.simplePath().barrier(),我的查询会花费很长时间。有什么方法可以改进我的查询吗
请注意,
emit()
遍历不是中断条件。您的遍历将继续,直到不再剩下简单的路径。此外,您还应该在
repeat()
内部执行
dedup()
,因为进一步遵循重复路径(基于
顶点)是没有意义的

g = TinkerFactory.createModern().traversal()
g.V().has("person","name","marko").as("from").
  repeat(both().as("to").dedup("from","to")).
    times(3). 
    emit(hasLabel("software")).
  hasLabel("software").
  project("p","data").
    by(path()).
    by(select(last, "from", "to").by("name"))
这应该以最有效的方式完成您想要的任务

gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().has("person","name","marko").as("from").
......1>   repeat(both().as("to").dedup("from","to")).
......2>     times(3). 
......3>     emit(hasLabel("software")).
......4>   hasLabel("software").
......5>   project("p","data").
......6>     by(path()).
......7>     by(select(last, "from", "to").by("name"))
==>[p:[v[1],v[3]],data:[from:marko,to:lop]]
==>[p:[v[1],v[4],v[5]],data:[from:marko,to:ripple]]
请注意,
emit()
遍历不是中断条件。您的遍历将继续,直到不再剩下简单的路径。此外,您还应该在
repeat()
内部执行
dedup()
,因为进一步遵循重复路径(基于
顶点)是没有意义的

g = TinkerFactory.createModern().traversal()
g.V().has("person","name","marko").as("from").
  repeat(both().as("to").dedup("from","to")).
    times(3). 
    emit(hasLabel("software")).
  hasLabel("software").
  project("p","data").
    by(path()).
    by(select(last, "from", "to").by("name"))
这应该以最有效的方式完成您想要的任务

gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().has("person","name","marko").as("from").
......1>   repeat(both().as("to").dedup("from","to")).
......2>     times(3). 
......3>     emit(hasLabel("software")).
......4>   hasLabel("software").
......5>   project("p","data").
......6>     by(path()).
......7>     by(select(last, "from", "to").by("name"))
==>[p:[v[1],v[3]],data:[from:marko,to:lop]]
==>[p:[v[1],v[4],v[5]],data:[from:marko,to:ripple]]

试图了解更多信息并优化查询,有些方法无法提高查询速度,你知道为什么吗?也就是说,在重复(都是().as(“to”).dedup(“from”,“to”))和重复(都是().simplePath().barrier().as(“to”).dedup(“from”,“to”))之间,根据文档,屏障步骤不应该更快吗?这不会改变任何东西,因为
dedup()
无论如何都是屏障步骤。另外,
simplePath()
在这里会让事情变得更糟,因为它不会更改遍历的路径,但它会启用路径跟踪,因此只会使事情变得更慢。尝试了解更多信息并优化查询,有些方法并不能提高查询速度,知道为什么吗?也就是说,在重复(都是().as(“to”).dedup(“from”,“to”))和重复(都是().simplePath().barrier().as(“to”).dedup(“from”,“to”))之间,根据文档,屏障步骤不应该更快吗?这不会改变任何东西,因为
dedup()
无论如何都是屏障步骤。此外,
simplePath()
在这里会让事情变得更糟,因为它不会更改遍历的路径,但它会启用路径跟踪,因此只会让事情变得更慢。