Gremlin 重复数据消除作为最短路径工作?还有别的选择吗?
样本数据:TinkerPop Modern (ID与我的结果不匹配,但您可以跳过ID)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
目标: 查找以某种方式(输入或输出)连接到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()
在这里会让事情变得更糟,因为它不会更改遍历的路径,但它会启用路径跟踪,因此只会让事情变得更慢。