如何通过过滤(Neo4j,Cypher)通过多种关系类型匹配所有可能的路径

时间:2019-06-20 23:52:04

标签: neo4j cypher

我是Neo4j的新手,我有一个相对复杂(但很小)的数据库,我将其简化为以下内容:  room/door/window example

第一扇门没有钥匙,其他所有门都有钥匙,窗户不需要钥匙。这个想法是,如果一个人有key:'A',我想看看他们可以走的所有可能路径。

这是生成数据库的代码

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 个答案:

答案 0 :(得分:1)

这应该对您有用:

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"}│
└────────────────┴────────────────┘