Neo4J (Cypher) запрос, чтобы найти все пути, которые не следуют шаблону - PullRequest
1 голос
/ 08 апреля 2020

У меня есть следующий график: График

Я хотел бы получить путь от Label_1 до Label_5, который не следует предварительно определенному шаблону. В частности, я хотел бы получить путь, который не следует шаблону: Label_1 -> Label_2 -> Label_3 -> Label_4 -> Label_5

Как видно на графике, нижняя ветвь (после Label_1) следует этому шаблону, а верхняя ветвь - не следует этому шаблону, так как у нас есть Label_1 -> Label_2 -> Label_4 -> Label_5

Это означает, что я ищу запрос, который вернул бы: Label_1 -> Label_2 -> Label_4 -> Label_5

Я пробовал следующий запрос, но этот не возвращает любой результат.

MATCH p=(e1n:Label_1)-[*]->(e2:Label_5)
WHERE NOT (:Label_1)-->(:Label_2)-->(:Label_3)-->(:Label_4)-->(:Label_5)
RETURN p

Поскольку я новичок в Neo4j и Cypher, я хотел бы спросить, как я могу написать такой запрос и почему мой подход с WHERE NOT не работает.

Для создания я использовал следующие команды создания:

CREATE (a:Label_1 {name: "Label_1"})
CREATE (b:Label_2 {name: "Label_2"})
CREATE (c:Label_2 {name: "Label_2"})
CREATE (d:Label_3 {name: "Label_3"})
CREATE (e:Label_4 {name: "Label_4"})
CREATE (f:Label_5 {name: "Label_5"})
CREATE (a)-[:FOLLOWS]->(b)
CREATE (a)-[:FOLLOWS]->(c)
CREATE (b)-[:FOLLOWS]->(d)
CREATE (c)-[:FOLLOWS]->(e)
CREATE (d)-[:FOLLOWS]->(e)
CREATE (e)-[:FOLLOWS]->(f)

1 Ответ

2 голосов
/ 08 апреля 2020

Что касается того, почему ваша фильтрация не работает, шаблон в предложении WHERE не применяется конкретно к вашему пути MATCHed. Вы просите его отфильтровать результат, если такой шаблон не существует во всем вашем графике. Поскольку существует шаблон, идущий от: Label_1 к: Label_5, как на вашем графике, ваш MATCH всегда будет неуспешным.

Вместо этого вы можете попробовать собрать пути, которые вы хотите исключить, и отфильтровать так, чтобы любой MATCHed пути не входят в исключенный набор:

MATCH path = (:Label_1)-->(:Label_2)-->(:Label_3)-->(:Label_4)-->(:Label_5)
WITH collect(path) as excluded
MATCH p=(e1n:Label_1)-[*]->(e2:Label_5)
WHERE NOT p IN excluded
RETURN p
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...