Как мне найти вершины без определенных ребер из определенной вершины в 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()
если тебе понравилось.