Как найти вершины без определенных ребер из определенной вершины в Гремлин? - PullRequest
1 голос
/ 17 марта 2020

Я использую python для выполнения моих запросов gremlin, к которым я все еще привыкаю / изучаю. Допустим, у меня есть метки вершин A и B, и может быть ребро от A до B, называемое abEdge. Я могу найти B вершин, которые имеют такие ребра из конкретной A вершины с:

g.V()\
    .hasLabel("A")\
    .has("uid", uid)\  # uid is from a variable
    .outE("abEdge")\
    .inV()\
    .toList()

Но как бы я go нашел нахождение B вершин, которые имеют нет таких ребер из конкретной A вершины?

Мой инстинкт состоит в том, чтобы попробовать следующее:

# Find B edges without an incoming edge from a particular A vertex
gremlin.V()\
    .hasLabel("B")\
    .where(__.not_(inE("abEdge").from_(
        V()\
        .hasLabel("A")\
        .has("uid", uid)
    )))\
    .next()

И это приводит к неправильному запросу (Пока не знаю, где именно) , я все еще читаю о Гремлин, но у меня тоже есть временные ограничения, поэтому я спрашиваю. Если кто-то и может помочь, но просто использует синтаксис groovy, который тоже подойдет, так как конвертировать между ними не так уж и плохо.

Любые объяснения тоже будут полезны, так как я все еще изучаю эту технологию.

Обновление

Я думаю, если бы это был вопрос из реальной жизни, связанный с этим сайтом. Мы могли бы спросить (A=Person, B=Programming-Language и abEdge=knows):

Какие языки программирования конкретный человек A не знает?

1 Ответ

2 голосов
/ 17 марта 2020

Похоже, у вас почти был ответ:

g.V().hasLabel("B"). \
  filter(__.not_(__.in_('abEdge').has("A","uid",uid))). \
  toList()

Я предпочитаю filter() при использовании только одного аргумента Traversal, но я думаю, что вы могли бы заменить на where(), если хотите.

...