4

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

假设您有一个以“读者”和“书”为节点的读书俱乐部数据库。'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 子句,它将两个书本别名输入到r“读者”节点的别名中。

问题:我将如何编写查询来查找已阅读小说AND非小说AND参考书的用户?当您要查找的内容超过 2 件时,我不知道您将如何编写 Match 子句。

4

2 回答 2

10

您可以在一个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
于 2013-05-06T17:24:37.423 回答
0

您可以使用 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
于 2013-05-06T17:08:22.687 回答