Neo4j 密码查询以查找具有3个关系的节点
在查找2个关系时,我知道了如何编写此查询,但不确定如何向查询中添加更多关系 假设您有一个book club数据库,其中“reader”和“book”作为节点。“book”节点具有“genre”属性(用于定义该书是小说、非小说、传记、参考等)。在“reader”节点和“book”节点之间存在“HasRead”关系,其中有人阅读了特定的书 如果我想找到同时阅读过小说和非小说类书籍的读者,我可以执行以下Cypher查询:Neo4j 密码查询以查找具有3个关系的节点,neo4j,cypher,Neo4j,Cypher,在查找2个关系时,我知道了如何编写此查询,但不确定如何向查询中添加更多关系 假设您有一个book club数据库,其中“reader”和“book”作为节点。“book”节点具有“genre”属性(用于定义该书是小说、非小说、传记、参考等)。在“reader”节点和“book”节点之间存在“HasRead”关系,其中有人阅读了特定的书 如果我想找到同时阅读过小说和非小说类书籍的读者,我可以执行以下Cypher查询: Start b1=node:MyBookIndex('Genre:Fiction
Start b1=node:MyBookIndex('Genre:Fiction'),
b2=node:MyBookIndex('Genre:Non-Fiction')
Match b1-[:HadRead]-r-[:HasRead]-b2
Return r.ReaderName
上述查询的关键是Match子句,它将两个图书别名输入到“reader”节点的r
别名中
问题:我将如何编写查询以查找阅读过小说和非小说和参考书的用户?我一直在想,当你要找的东西超过2件时,你会怎么写Match子句。你可以使用cypher'with'子句-
start b1=node:MyBookIndex('Genre:Fiction'),
b2=node:MyBookIndex('Genre:Non-Fiction'),
b3=node:MyBookIndex('Genre:Reference')
match b1-[:HasRead]-r-[:HasRead]-b2
with b3, r
match b3-[:HasRead]-r
return r.ReaderName
可以在单个
MATCH
子句中指定多行,并用逗号分隔。例如,以下两个MATCH
子句在语义上是等价的(引擎将对其进行相同的计算):
您可以有任意数量的匹配项。因此,将其插入您的查询中,您可以得到:
start b1=node:MyBookIndex('Genre:Fiction'),
b2=node:MyBookIndex('Genre:Non-Fiction'),
b3=node:MyBookIndex('Genre:Reference')
match b1-[:HasRead]-r,
b2-[:HasRead]-r,
b3-[:HasRead]-r
return r.ReaderName
在本例中,将
与
一起使用的一个问题是,在继续筛选出与b3
没有关系的部分之前,您强制neo4j完全枚举第一批r
s。在这种特殊情况下,性能可能很重要,也可能不重要,但一般来说,最好使用多个MATCH
es。@ean5533不确定性能是否会受到影响,不知道neo4j是如何在引擎盖下处理的,但使用多个MATCH显然看起来更干净+1.我在别处读过WITH子句,以及它提供的类似于UNIX管道命令的强大灵活性。不过,出于我的目的,我将坚持@Gopi的建议,因为我发现它的语法更可读/更容易理解。
start b1=node:MyBookIndex('Genre:Fiction'),
b2=node:MyBookIndex('Genre:Non-Fiction'),
b3=node:MyBookIndex('Genre:Reference')
match b1-[:HasRead]-r,
b2-[:HasRead]-r,
b3-[:HasRead]-r
return r.ReaderName