首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于远程调用的traversal.asAdmin().addStep(step)

用于远程调用的traversal.asAdmin().addStep(step)
EN

Stack Overflow用户
提问于 2018-12-04 23:21:57
回答 1查看 111关注 0票数 0

我正在尝试使用Java构建到远程JanusGraph服务器的复杂遍历。

下面的遍历返回由标签“mylabel”标识的ReferenceVertex元素:

代码语言:javascript
复制
GraphTraversal<Vertex, Vertex> t = g.V().hasLabel("mylabel");
List<Vertex> r = t.toList();

对于更复杂的查询,我需要将构成整个查询一部分的多个遍历连接起来。以下代码说明了这一概念:

代码语言:javascript
复制
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()返回

代码语言:javascript
复制
[GraphStep(vertex,[]), HasStep([~label.eq(mylabel)])]

我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-05 00:25:09

我不认为您需要进入任何asAdmin()方法。与其构建匿名遍历来尝试附加到父遍历,我认为最好只是传递父GraphTraversal实例,并根据需要添加步骤:

代码语言:javascript
复制
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()方法可以绕过一些内部工作,并且遍历的这些部分不会发送到服务器--这是解释它的简单方法。如果您绝对必须以这种方式构造遍历的匿名部分,然后以这种方式追加它们,那么我想我会这样做:

代码语言:javascript
复制
GraphTraversal<Vertex, Vertex> addMe = __.hasLabel("mylabel");
GraphTraversal<Vertex, Vertex> t = g.V();
List<Vertex> r = t.filter(addMe).toList();

我不特别喜欢这种方法,因为根据您正在做的事情,您可能会筛选出优化遍历的JanusGraph遍历策略,这样您就会失去一些性能优化。我也不太喜欢这种风格--只是把GraphTraversal传递给需要用新步骤修改它的函数似乎更自然。您可能还会发现关于遍历重用的这一信息很有帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53622891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档