Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j 密码查询以查找具有3个关系的节点_Neo4j_Cypher - Fatal编程技术网

Neo4j 密码查询以查找具有3个关系的节点

Neo4j 密码查询以查找具有3个关系的节点,neo4j,cypher,Neo4j,Cypher,在查找2个关系时,我知道了如何编写此查询,但不确定如何向查询中添加更多关系 假设您有一个book club数据库,其中“reader”和“book”作为节点。“book”节点具有“genre”属性(用于定义该书是小说、非小说、传记、参考等)。在“reader”节点和“book”节点之间存在“HasRead”关系,其中有人阅读了特定的书 如果我想找到同时阅读过小说和非小说类书籍的读者,我可以执行以下Cypher查询: Start b1=node:MyBookIndex('Genre:Fiction

在查找2个关系时,我知道了如何编写此查询,但不确定如何向查询中添加更多关系

假设您有一个book club数据库,其中“reader”和“book”作为节点。“book”节点具有“genre”属性(用于定义该书是小说、非小说、传记、参考等)。在“reader”节点和“book”节点之间存在“HasRead”关系,其中有人阅读了特定的书

如果我想找到同时阅读过小说和非小说类书籍的读者,我可以执行以下Cypher查询:

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