Как мне найти вершины без определенных ребер из определенной вершины в Gremlin?

Я использую 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()

Но как я могу найти 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()

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

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

Обновить

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

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

1 ответ

Решение

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

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

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

Другие вопросы по тегам