我正在尝试使用Java构建到远程JanusGraph服务器的复杂遍历。
下面的遍历返回由标签“mylabel”标识的ReferenceVertex元素:
GraphTraversal<Vertex, Vertex> t = g.V().hasLabel("mylabel");
List<Vertex> r = t.toList();对于更复杂的查询,我需要将构成整个查询一部分的多个遍历连接起来。以下代码说明了这一概念:
GraphTraversal<Vertex, Vertex> addMe = __.hasLabel("mylabel");
GraphTraversal<Vertex, Vertex> t = g.V();
for (Step<?, ?> step : addMe.asAdmin().getSteps()) {
t.asAdmin().addStep(step);
}
List<Vertex> r = t.toList();对于本地访问,这是可行的。但是,对于远程访问,它返回服务器上所有可用的顶点,而不是标签标识的顶点。
在这两种情况下,t.toString()返回
[GraphStep(vertex,[]), HasStep([~label.eq(mylabel)])]我做错了什么?
发布于 2018-12-05 00:25:09
我不认为您需要进入任何asAdmin()方法。与其构建匿名遍历来尝试附加到父遍历,我认为最好只是传递父GraphTraversal实例,并根据需要添加步骤:
private static GraphTraversal addFilters(GraphTraversal t) {
return t.hasLabel("mylabel");
}
...
GraphTraversal<Vertex, Vertex> t = g.V();
t = addFilters(t);
List<Vertex> r = t.toList();您的方法不适用于远程遍历是有原因的,这与Gremlin字节码是如何在幕后构建的有关。使用asAdmin()方法可以绕过一些内部工作,并且遍历的这些部分不会发送到服务器--这是解释它的简单方法。如果您绝对必须以这种方式构造遍历的匿名部分,然后以这种方式追加它们,那么我想我会这样做:
GraphTraversal<Vertex, Vertex> addMe = __.hasLabel("mylabel");
GraphTraversal<Vertex, Vertex> t = g.V();
List<Vertex> r = t.filter(addMe).toList();我不特别喜欢这种方法,因为根据您正在做的事情,您可能会筛选出优化遍历的JanusGraph遍历策略,这样您就会失去一些性能优化。我也不太喜欢这种风格--只是把GraphTraversal传递给需要用新步骤修改它的函数似乎更自然。您可能还会发现关于遍历重用的这一信息很有帮助。
https://stackoverflow.com/questions/53622891
复制相似问题