Gremlin - использование шага OR для получения различных типов связанных вершин - PullRequest
0 голосов
/ 04 октября 2019

Итак, у меня есть схема графа, в которой тип вершины A может соединяться внутрь с типом вершины B или типом C в отношении один ко многим. Я пытаюсь написать запрос, который выводит любые из этих отношений, если они существуют, например, пример вывода будет:

Type A | Type B | Type C
Sample1A,'', Sample1C
Sample2A, Sample2B, ''
Sample3A, Sample3B, Sample3C
Sample4A, 'Sample4Ba, Sample4Bb', Sample4C

Четвертый пример, если A подключен к нескольким типам B. Если B и C не существуют, то ничего не выводится.

Пока у меня есть запрос: g.V().hasLabel('A').as('A').in('connect').hasLabel('B').as('B').or().in('connect').hasLabel('C').as('C').select('A','B','C')

Но этот запрос возвращает только вершины A без каких-либо B или C.

Использование AWS Neptune, если это имеет значение.

Ответы [ 2 ]

1 голос
/ 09 октября 2019

Как упомянул Кевин в комментарии, вы можете использовать метод .project () для этого сценария.

g.V().hasLabel("A").as("A").project("a","b", "c")
    .by(select("A"))
    .by(choose(in("connect").hasLabel("B").count().is(0), constant("NO_B").value(), in("connect").hasLabel("B")))
    .by(choose(in("connect").hasLabel("C").count().is(0), constant("NO_C").value() , in("connect").hasLabel("C")));
0 голосов
/ 06 октября 2019

Ваши или () шаги не возвращают результат, как написано. Вы можете упростить запрос следующим образом:

g.V().hasLabel('A').as('A').in('connect').hasLabel(within('B','C').as('B').select('A','B')

Это позволяет избежать использования select ('A', 'B', 'C') в качестве только одного из 'B' или 'C 'будет иметь результат в случае or ().

Вот версия, которая все еще использует или ()

g.V().hasLabel('A').as('A').in().or(hasLabel('B'),hasLabel('C')).as('B').select('A','B')
...