Как сопоставить все возможные пути через несколько типов отношений с фильтрацией (Neo4j, Cypher) - PullRequest
0 голосов
/ 21 июня 2019

Я новичок в Neo4j, и у меня есть относительно сложная (но небольшая) база данных, которую я упростил до следующего: room/door/window example

У первой двери нет ключа, у всех других дверей есть ключи,окно не требует ключа.Идея состоит в том, что если у человека есть key:'A', я хочу увидеть все возможные пути, по которым он может пойти.

Вот код для генерации db

CREATE (r1:room {name:'room1'})-[:DOOR]->(r2:room {name:'room2'})-[:DOOR {key:'A'}]->(r3:room {name:'room3'})
CREATE (r2)-[:DOOR {key:'B'}]->(r4:room {name:'room4'})-[:DOOR {key:'A'}]->(r5:room {name:'room5'})
CREATE (r4)-[:DOOR {key:'C'}]->(r6:room {name:'room6'})
CREATE (r2)-[:WINDOW]->(r4)

Вот запросЯ пытался, ожидая, что он вернет все, кроме room6, вместо этого у меня есть ошибка, которая означает, что я действительно не знаю, как построить запрос.

with {key:'A'} as params
match (n:room {name:'room1'})-[r:DOOR*:WINDOW*]->(m)
where r.key=params.key or not exists(r.key)
return n,m

Чтобы было ясно, я немне не нужно отлаживать мой запрос, а помочь понять, как правильно его написать.

Спасибо!

1 Ответ

1 голос
/ 21 июня 2019

Это должно работать для вас:

WITH  {key:'A'} AS params
MATCH p=(n:room {name:'room1'})-[:DOOR|WINDOW*]->(m)
WHERE ALL(r IN RELATIONSHIPS(p) WHERE NOT EXISTS(r.key) OR r.key=params.key)
RETURN n, m

С вашими данными выборки результат:

╒════════════════╤════════════════╕
│"n"             │"m"             │
╞════════════════╪════════════════╡
│{"name":"room1"}│{"name":"room2"}│
├────────────────┼────────────────┤
│{"name":"room1"}│{"name":"room3"}│
├────────────────┼────────────────┤
│{"name":"room1"}│{"name":"room4"}│
├────────────────┼────────────────┤
│{"name":"room1"}│{"name":"room5"}│
└────────────────┴────────────────┘
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...