我是Neo4j的新手,我有一个相对复杂(但很小)的数据库,我将其简化为以下内容:
第一扇门没有钥匙,其他所有门都有钥匙,窗户不需要钥匙。这个想法是,如果一个人有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
需要明确的是,我不需要调试查询就可以帮助理解如何正确地编写它。
谢谢!
答案 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"}│
└────────────────┴────────────────┘