2013-05-06 115 views
2

我想知道如何在查找2个关系时编写此查询,但不知道如何向查询添加更多关系。Cypher查询找到有3个​​关系的节点

假设您有一个以'reader'和'book'为节点的图书俱乐部数据库。 'book'节点具有'流派'属性(定义该书是小说,非小说,传记,参考等)。在'读者'节点和'书籍'节点之间存在关系“HasRead”,其中有人读过一本特定的书。

如果我想找到已经阅读包括小说非小说类书籍的读者,我会执行这个暗号查询:

Start b1=node:MyBookIndex('Genre:Fiction'), 
     b2=node:MyBookIndex('Genre:Non-Fiction') 
Match b1-[:HadRead]-r-[:HasRead]-b2 
Return r.ReaderName 

上述查询的关键是有匹配条款两个账号别名为“读者”节点输入r别名。

问:我将如何编写查询,发现已经阅读小说非小说参考书籍的用户?当你有两件以上的事情要找的时候,我一直坚持写如何写Match子句。

回答

7

可以具有在单个MATCH子句中指定的多个线,用逗号分开。例如,下面的两个MATCH条文在语义上等同(并会被发动机相同的评价):

//these mean the same thing! 
match a--b--c 
match a--b, b--c 

你可以有任意数量的这些比赛。因此,堵塞该到你的查询,你将会得到:

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 
+0

这就像一个魅力! – 2013-05-07 17:11:29

0

你可以用户暗号“”子句 -

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 
+0

的一个问题,使用'WITH'在这种情况下是你逼的Neo4j继续滤波器之前完全列举首批'r's那些与'b3'没有关系的人。在这种特殊情况下,性能可能并不重要,但总的来说,最好使用多个“MATCH”。 – ean5533 2013-05-06 17:26:08

+0

@ ean5533不确定性能是否会受到影响,不知道neo4j如何在引擎盖下进行处理,但是使用多个匹配看起来更清晰。 +1! – Gopi 2013-05-06 17:31:51

+0

我已阅读过其他地方的W​​ITH子句以及它提供的类似于UNIX管道命令的强大的灵活性。尽管我的目的是这样,但我会坚持@ Gopi的建议,因为我发现它是一种更易读易懂的语法。 – 2013-05-07 17:13:57

相关问题