首页 > 解决方案 > 不了解如何在 Gremlin.net 中使用 Tree()

问题描述

我正在尝试将以下示例翻译为 Gremlin.net (c#)

https://kelvinlawrence.net/book/Gremlin-Graph-Guide.html#btree

示例在 Groovy 中

t=g.V().hasLabel('root').repeat(out()).emit().tree().by('data').next()

文档声明 t 的类型应该是

class org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree

但我在 gremlin.net 中找不到等价类型

Gremlin.Process.Traversal 下只有一个 Strategy 命名空间,我似乎在其他地方找不到任何树类型。

我正在使用 Gremlin.net 运行 Gremlin Server 和 ac# 项目。

public void Test()
    {
        using(GremlinClient client = GetClient())
        {
            using (DriverRemoteConnection conn = GetDriverRemoteConnection(client))
            {
                Graph graph = new Graph();
                GraphTraversalSource g = graph.Traversal().WithRemote(conn);

                // Builds a small ordered Binary (BST) Tree
                g.AddV("root").Property("data", 9).As("root")
                    .AddV("node").Property("data", 5).As("b")
                    .AddV("node").Property("data", 2).As("c")
                    .AddV("node").Property("data", 11).As("d")
                    .AddV("node").Property("data", 15).As("e")
                    .AddV("node").Property("data", 10).As("f")
                    .AddV("node").Property("data", 1).As("g")
                    .AddV("node").Property("data", 8).As("h")
                    .AddV("node").Property("data", 22).As("i")
                    .AddV("node").Property("data", 16).As("j")
                    .AddE("left").From("root").To("b")
                    .AddE("left").From("b").To("c")
                    .AddE("right").From("root").To("d")
                    .AddE("right").From("d").To("e")
                    .AddE("right").From("e").To("i")
                    .AddE("left").From("i").To("j")
                    .AddE("left").From("d").To("f")
                    .AddE("right").From("b").To("h")
                    .AddE("left").From("c").To("g").Iterate();
                //the .Tree() step requires either a string argument (I believe as a step label), or can be used taking a Generic .Tree<someType>() but I do not know what type to declare to match the example.
                var tree = g.V().HasLabel("root").Repeat(__.Out()).Emit().Tree("a").By("data").Next();

                Type x = tree.GetType();
                // x == {Gremlin.Net.Structure.Vertex}
            }
        }
    }

我错过了什么?

标签: c#gremlin

解决方案


我认为您遇到了在完整的 Gremlin 虚拟机(即 Java)范围内开发的 Gremlin 和作为 Gremlin 语言变体的 Gremlin 之间的剩余不一致之一 - 在您的情况下,Gremlin.NET。我认为这tree()在任何 GLV 中都没有完全支持。有趣的是,您表明您正在获得Vertex回报,因为我预计会出现某种形式的序列化错误,因为我认为 Gremlin.NET 甚至不知道如何反序列化g:TreeTree即使是这样,我们在 .NET 中也没有对象可以将其反序列化。

我似乎记得,tree()尽管序列化和序列化的问题更加深入,并且根植于 Jackson 库中的一些问题,但现在这些问题都可能在最近得到解决。

请注意,您将在使用 -step 时遇到类似的限制,因为GLV 端subgraph()没有对象可以将其反序列化。Graph我想知道在这些情况下,我们是否至少不能默认返回原始 JSON 本身。手动解析不会很有趣,但在某些用例中它可能总比没有好。

我为持续跟踪TINKERPOP-2063创建了这个问题。


推荐阅读