策略可以与Gremlin中的远程遍历一起使用吗?

时间:2017-07-04 13:53:49

标签: gremlin tinkerpop3 janusgraph

我使用Gremlin-Java与远程模式与JanusGraph进行交互。我现在在边缘定义一个新属性,以便在使用特定策略时对其进行过滤。 以下是我尝试在我的应用程序中运行的代码,但该策略似乎完全被忽略了。在本地TP实例上执行的相同代码正在运行。

graph.traversal()
    .withRemote(DriverRemoteConnection.using(cluster, "g"))
    .withStrategies(SubgraphStrategy.build().edges(__.has("field", "condition")).create())

有人知道此功能是否仍然不受支持?我使用的是Janus 0.1.0。

1 个答案:

答案 0 :(得分:3)

这似乎是Apache TinkerPop中的一个错误。我opened an issue来跟踪此事。

一种解决方法是将远程驱动程序配置配置为使用GraphSON序列化程序而不是Gryo。这不需要对服务器配置进行任何更改。例如,在conf/remote-objects.yaml

hosts: [localhost]
port: 8182
serializer: { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0,
          config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] } }

另一种解决方法是在Gremlin Server脚本中定义另一个遍历源。例如,如果您使用的是默认conf/gremlin-server/gremlin-server.yaml,请更新scripts/empty-sample.groovy中的全局绑定:

// define the default TraversalSource to bind queries to - named "g".
// define a subgraph traversal source - named "sg"
globals << [g : graph.traversal(),
    sg: graph.traversal().withStrategies(SubgraphStrategy.build().edges(
        __.has("field", "condition")).create())]

然后您可以使用远程驱动程序中的遍历源:

cluster = Cluster.open('conf/remote-objects.yaml')
graph = EmptyGraph.instance()
sg = graph.traversal().withRemote(DriverRemoteConnection.using(cluster, "sg"))