Получить все неизвестные вершины, связанные с известной вершиной, с помощью C# Datastax CassandraCSharpDriver.Graph - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь получить все неизвестные вершины, которые связаны с известной вершиной ребром, используя C# Datastax CassandraCSharpDriver.Graph code.

Этот код gremlin правильно возвращает список неизвестных вершин как а также целевая известная вершина:

g.V().has("mything","key", "mykey")
.emit()
.repeat(outE("contains").inV()).valueMap(true)

Я пробовал обход, подобный этому, в C#, но он не возвращается, я думаю, что повторение бесконечно (или очень медленно):

g.V()
.Has("mything", "key", "mykey")
.Emit()
.Repeat(g.V()
.Has("mything", "key", "mykey")
.OutE("contains").InV())

Я пытаюсь выполнить такой обход в C#, но компилятор не примет '("query")', поэтому я не уверен, как поместить обход в предложение Repeat:

g.V()
.Has("mything", "key", "mykey")
.As("query").Emit()
.Repeat(("query").OutE("contains").InV())

Что за хитрость в предложении Repeat? Или есть лучший способ получить все неизвестные вершины, связанные с известной вершиной в C#?

1 Ответ

1 голос
/ 05 марта 2020

Я думаю, вы ищете класс обхода анонимного графа Gremlin.Net.Process.Traversal.__:

var graphResultSet = await session.ExecuteGraphAsync(g.V()
                .Has("mything", "key", "mykey").Emit()
                .Repeat(__.OutE("contains").InV())).ConfigureAwait(false);

Я выполнил простой фрагмент кода с этим запросом (показанным ниже) и получил вывод консоли:

[label: mything; key: mykey]
[label: mything1; key: mykey15]
[label: mything1; key: mykey12]
[label: mything; key: mykey]
[label: mything1; key: mykey17]
[label: mything1; key: mykey16]
[label: mything1; key: mykey14]
[label: mything1; key: mykey13]
[label: mything1; key: mykey1]

Фрагмент кода:

        session.ExecuteGraph(new SimpleGraphStatement(
            "schema.propertyKey('key').Text().ifNotExists().create();" +
            "schema.edgeLabel('contains').multiple().ifNotExists().create();" +
            "schema.vertexLabel('mything').properties('key').ifNotExists().create();" +
            "schema.vertexLabel('mything1').properties('key').ifNotExists().create();" + 
            "schema.edgeLabel('contains').connection('mything', 'mything1').add();"));

        var g = DseGraph.Traversal(session);

        await session.ExecuteGraphAsync(g
                .AddV("mything").Property("key", "mykey").As("cp")
                .AddV("mything").Property("key", "mykey").As("cp1")
                .AddV("mything1").Property("key", "mykey1").As("cl")
                .AddV("mything1").Property("key", "mykey12").As("cl1")
                .AddV("mything1").Property("key", "mykey13").As("cl2")
                .AddV("mything1").Property("key", "mykey14").As("cl3")
                .AddV("mything1").Property("key", "mykey15").As("cl4")
                .AddV("mything1").Property("key", "mykey16").As("cl5")
                .AddV("mything1").Property("key", "mykey17").As("cl6")
                .AddE("contains").From("cp").To("cl")
                .AddE("contains").From("cp1").To("cl1")
                .AddE("contains").From("cp").To("cl2")
                .AddE("contains").From("cp").To("cl3")
                .AddE("contains").From("cp1").To("cl4")
                .AddE("contains").From("cp").To("cl5")
                .AddE("contains").From("cp").To("cl6"))
            .ConfigureAwait(false);

        var graphResultSet = await session.ExecuteGraphAsync(g.V()
            .Has("mything", "key", "mykey").Emit()
            .Repeat(__.OutE("contains").InV())).ConfigureAwait(false);

        var vertices = graphResultSet.Select(elem => elem.To<Vertex>()).ToList();

        Console.WriteLine(
            string.Join(
                Environment.NewLine,
                vertices.Select(v => $"[label: {v.Label}; key: {v.GetProperty("key").Value}]")));
...