1

我正在尝试对连接到节点 A 的节点进行计数,其中节点 A 是从节点 B 开始的 Cypher 查询的一部分,我得到了意想不到的结果。这是一个示例设置。假设我们正在查看书籍和所有者,并且书籍引用其他书籍,而所有者当然拥有书籍:

Book B1
Book B2 CITES B1
Book B3 CITES B1
Book B4
Owner O1 OWNS B1
Owner O2 OWNS B2
Owner O3 OWNS B3 and B4

因此,假设我正在查看 B1 书,并且我想找到引用它的每一本书,然后计算拥有该施引书的每个人所拥有的书籍。所以如果我从 B1 开始,我应该找到所有者 O2 和 O3,因为每个人都拥有一本引用 B1 的书。如果我计算他们拥有的书籍,我应该得到 O2 的 1 和 O3 的 2。

因此,首先,仅列出所有者的查询可以正常工作:

start a=node(1) MATCH a<-[:CITES]-b<-[:OWNS]-c return c.name

这将按预期返回名称。但是这个查询:

start a=node(1) MATCH a<-[:CITES]-b<-[:OWNS]-c-[:OWNS]->d return c.name, count(d)

似乎它应该到达 c,它是所有者列表,然后通过 OWNS 关系到拥有的书籍作为 d,并计算它们。但相反,我得到:

+--------------------+
| c.name  | count(d) |
+--------------------+
| "O3"    | 1        |
+--------------------+

感觉就像它忽略了已经通过其他 OWNS 链接找到的书籍/节点——由 b 表示的那些。有没有办法在单个查询中执行此操作,或者最好将所有者收集为 c,然后再次查询每个所有者?感觉这应该是可能的,但我还没有想通。任何想法都会很棒 - 在此先感谢。

4

1 回答 1

0

你是对的,一旦找到一个节点,你就不能在不同的命名变量下的同一个匹配中再次找到它。您可以使用 a 将其分解WITH,然后d以相同的方式使用,它将匹配所有这些。

START a=node(14) 
MATCH a<-[:CITES]-b<-[:OWNS]-c 
WITH c MATCH c-[:OWNS]->d 
RETURN c.name, count(d);

http://console.neo4j.org/?id=x1jst9

于 2012-10-04T05:41:49.920 回答