не понимая, как использовать Tree () в Gremlin.net - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь перевести следующий пример на 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 Server и проект ac # с Gremlin.net.

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}
            }
        }
    }

Чего мне не хватает?

1 Ответ

0 голосов
/ 12 октября 2018

Я думаю, что вы столкнулись с одной из оставшихся несоответствий между Gremlin, созданным в рамках полной виртуальной машины Gremlin (т. Е. Java), и Gremlin в качестве варианта языка Gremlin - в вашем случае, Gremlin.NET.Я не думаю, что tree() имеет полную поддержку в любом GLV.Интересно, что вы показываете, что получаете обратно Vertex, как я и ожидал, в той или иной форме ошибки сериализации, поскольку я не думал, что Gremlin.NET даже знал, как десериализовать g: Tree .Даже если бы это было так, у нас нет объекта Tree в .NET, чтобы десериализовать его.

Кажется, я вспоминаю, что проблемы с tree() и сериализацией зашли еще глубже и укоренились в некоторых проблемах в библиотеке Джексона, но возможно, что все они решены сейчас в более поздние времена.

Обратите внимание, что с subgraph() -шагом вы столкнетесь с аналогичными ограничениями, поскольку на стороне GLV нет объекта Graph для десериализации.Интересно, если бы в этих случаях мы не могли просто по умолчанию вернуть сам необработанный JSON.Разбирать вручную было бы неинтересно, но в некоторых случаях это может быть лучше, чем ничего.

Я создал эту проблему для постоянного отслеживания TINKERPOP-2063 .

...