Как проверить, существует ли глобально узел и задать ли ему условие в Cypher? - PullRequest
0 голосов
/ 25 апреля 2018

Я борюсь с проблемой создания запроса в Cypher.Давайте использовать этот график в качестве примера:

MERGE(a:Person {name:'Alice', age:38, eyes:'brown'})
MERGE(c:Person {name:'Charlie', age:53, eyes:'green'})
MERGE(d:Person {name:'Daniel', age:54, eyes:'brown'})
MERGE(b:Person {name:'Bob', age:25, eyes:'blue'})
MERGE(a)-[:KNOWS]->(c)
MERGE(a)-[:KNOWS]->(b)
MERGE(c)-[:KNOWS]->(d)
MERGE(b)-[:KNOWS]->(d)

Я хотел бы иметь запрос, который возвращает мне узлы с name = 'Alice', только если нет узлов с name = 'Bob'.Поэтому, если есть Боб, я бы не хотел видеть результатов.

Вот что я пробовал:

1) С существует ()

MATCH p =(n)-[*1..3]->(b)
WHERE n.name = 'Alice' AND NOT EXISTS ((n {name: 'Bob'})-[*1..3]->(b))
RETURN p

Но этовозвращает все узлы и отношения.

2) С none ()

MATCH p =(n)-[*1..3]->(b)
WHERE n.name = 'Alice' AND NONE (x IN nodes(p) WHERE x.name = 'Bob')
RETURN p

Это вернуло все узлы, без Боба ...

3) с любым ()

MATCH p =(n)-[*1..3]->(b)
WHERE n.name = 'Alice' AND NOT ANY (x IN nodes(p) WHERE x.name = 'Bob')
RETURN p

Но это дало мне тот же результат, что и выше.

У меня заканчиваются идеи, как вернуть Алису, только если Боба нет.Что я мог бы ожидать от запроса, так это возвращать Алису, когда я удаляю Боба, но когда такой узел существует - ничего.

Любая помощь приветствуется:)

Спасибо!

1 Ответ

0 голосов
/ 25 апреля 2018

Вы должны попробовать этот запрос:

MATCH (n:Person {name:'Alice'})
WHERE NOT (n)-[:KNOWS*..3]-(:Person {name:'Bob'})
RETURN n
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...