结合遍历 API 和 Gremlin

Combine Traversal API and Gremlin

这可能是个愚蠢的问题。

我喜欢遍历 API 因为我从我的 Java 程序中获得了类型安全,但是我正在探索将它与 Gremlin API 结合使用的可能性。

大致如下。我猜这是不可能的,但想知道。

GraphTraversalSource g; // Get reference
g.V().has('author', 'name', 'Duke').injectGrooovy('SomeExternalGroovy').toList()

我将从旁注开始....我不会区分 "Traversal API" 和 "Gremlin API" - 这不是我们通常进行的比较。 Traversal API 和 Graph API 是有区别的。 Traversal API 适用于用户(如您),而 Graph API 适用于想要启用 TinkerPop 的图形提供者(如 DSE Graph)。 Traversal API 通过 GraphTraversalSource 初始化,通常命名为 g,而 Graph API 通过 Graph 初始化,通常命名为 graph。您可以在遍历 API here and the Graph API here. The Traversal API forms the steps that we think of in the Gremlin language.

中查看相关 classes 的 javadoc

相当于 injectGroovy("SomeExternalGroovy") 可能类似于:

g.V().has('author','name','Duke').map(Lambda.function("it.get().value('name')"))

它基本上将 Groovy 闭包作为字符串传递到 map() 步骤,服务器将在执行遍历时在服务器的上下文中评估该字符串。当然,我在这里假设您正在通过 DseGraph class 创建 g,如下所示:

GraphTraversalSource g = DseGraph.traversal();

如果您只是提交一个字符串,那么您可以直接使用 Groovy 做:

dseSession.executeGraph("g.V().has('author','name','Duke').map{it.get().value('name')"};

请注意,您需要在 DSE Graph 中启用 lambdas 才能使其正常工作,方法是发出如下命令:

graph.schema().config().option("graph_name.traversal_sources.g.restrict_lambda").set(false)

在你做任何这些之前,你应该问问自己为什么需要使用 lambda。 TinkerPop 通常建议您避免在 Gremlin 中使用 lambda,并且仅在没有其他可用选项时才使用它们。 Gremlin 非常有表现力,在大多数情况下,您通常可以找到适当的 Gremlin 步骤来复制您在 lambda 中所做的事情。