在 JanusGraph 上使用 Gremlin 限制最短路径查询的深度



我在JanusGraph中有一个相当大的图(目前3806702顶点和7774654边,所有边都有相同的标签(。我对其中的最短路径搜索感兴趣。Gremlin 食谱提到了这个查询:

g.V(startId).until(hasId(targetId)).repeat(out().simplePath()).path().limit(1)

这会立即返回我知道是正确的路径,但随后挂起控制台(top显示 janusgraph 和 scylla 正在疯狂地处理东西,所以我想它在后台工作,但需要永远(。如果像这样使用,它会做正确的事情并返回第一个(正确的(最短路径:

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)
...

有谁知道我如何应用这样的限制?我需要它快速返回第一个结果或失败。

谢谢!

until()中添加另一个中断条件,并确保在请求路径之前limit()结果:

g.V(startId).
until(__.hasId(targetId).or().loops().is(100)).
repeat(__.both().simplePath()).
hasId(targetId).limit(1).path()

在此遍历中调用tryNext()会给您带来Optional<Path>。如果为空,则在给定距离内未找到路径。

最新更新