Cypher查询以查找具有3个关系的节点

时间:2013-05-06 16:34:54

标签: neo4j cypher

我在寻找2个关系时想出了如何编写此查询,但不确定如何为查询添加更多关系。

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

如果我想找到读过小说 AND 非小说类书籍的读者,我可以执行此Cypher查询:

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

上述查询的关键是Match子句,它具有两个书籍别名,用于“读者”节点的r别名。

问题:如何编写查询以查找已阅读过虚构 AND 非虚构 AND 参考书籍的用户?当你有两件以上的东西时,我会坚持你如何编写匹配条款。

2 个答案:

答案 0 :(得分:8)

您可以在单个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

答案 1 :(得分:0)

您可以使用'子句来使用cypher' -

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