我在JanusGraph中有一个相当大的图形(目前有3806702个顶点和7774654个边,所有边都有相同的标签)。我对它中的最短路径搜索感兴趣。 Gremlin食谱提到了这个问题:
g.V(startId).until(hasId(targetId)).repeat(out().simplePath()).path().limit(1)
这会立即返回我知道正确的路径,但随后会挂起控制台(top
显示janusgraph和scylla正在疯狂处理,所以我猜它正在工作< / em>在后台,但它需要永远)。它做正确的事情并返回第一个(正确的)最短路径,如果这样使用:
g.V(startId).until(hasId(targetId)).repeat(out().simplePath()).path().next()
我想限制这个查询,以便gremlin / janusgraph停止搜索路径,让我们说100跳(所以我想要100个边缘的最大深度)。我曾尝试在多个位置使用.times(100)
,但如果.until()
在同一查询中与.times()
一起使用,则它总是在gremlin遍历类中使用NullPointerException崩溃,即:
java.lang.NullPointerException
at org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper.hasStepOfAssignableClassRecursively(TraversalHelper.java:351)
at org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.RepeatUnrollStrategy.apply(RepeatUnrollStrategy.java:61)
at org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalStrategies.applyStrategies(DefaultTraversalStrategies.java:86)
at org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal.applyStrategies(DefaultTraversal.java:119)
at org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal.next(DefaultTraversal.java:198)
at java_util_Iterator$next.call(Unknown Source)
...
有谁知道如何应用此限制?我需要这个以快速返回第一个结果或失败。
谢谢!
答案 0 :(得分:1)
在您的until()
中添加另一个中断条件,并确保在请求路径之前limit()
进行结果:
g.V(startId).
until(__.hasId(targetId).or().loops().is(100)).
repeat(__.both().simplePath()).
hasId(targetId).limit(1).path()
为此遍历调用tryNext()
会给您Optional<Path>
。如果为空,则在给定距离内找不到路径。