将模式元素与Cypher中的多个节点相关联

时间:2014-09-26 16:31:27

标签: neo4j cypher

match (rootTk:Toolkit {level: "Level 0"})<-[:PrimaryChild*]-(tk:Toolkit)<-[:visitTo]-(hit:PageHit)
return rootTk.title, count(hit.id)

在这种情况下,每个rootTk代表工具包树的根。我想返回与每棵树相关的点击次数。上面的查询接近我想要的,但它不包括与每棵树的根相关的命中,只包括它的子项。

如何将模式的<-[:visitTo]-(hit:PageHit)部分与子工具包和关联的根工具包相关联?

2 个答案:

答案 0 :(得分:1)

虽然可选匹配可以解决问题,但更简单的解决方案是使用零作为路径长度范围内的起点。这包括树中的根项。

MATCH(rootTk:Toolkit {level:&#34; Level 0&#34;})&lt; - [:PrimaryChild * 0 ..] - (tk:Toolkit)&lt; - [:visitTo] - (点击: PageHit) 将rootTk.title作为标题返回,将COUNT(hit.id)作为Hits

返回

答案 1 :(得分:0)

编辑 - 吉姆的回答 对于这个问题,Jim有更好的答案,任何找到这个问题的人都应该使用。

MATCH (rootTk:Toolkit {level: "Level 0"})<-[:PrimaryChild*0..]-(tk:Toolkit)<-[:visitTo]-(hit:PageHit)
RETURN rootTk.title as Title,COUNT(hit.id) as Hits

它使用0长度(到无穷大)路径匹配,以使PrimaryChild关系成为非强制性。

原始答案

MATCH (rootTk:Toolkit {level: "Level 0"})<-[:PrimaryChild*]-(tk:Toolkit)<-[:visitTo]-(hit:PageHit)
RETURN rootTk.title, COUNT(hit)

正如你所说,这将仅返回tk节点上的命中,以获得根目录上的命中我认为这将起作用:

MATCH (rootTk:Toolkit {level: "Level 0"})
OPTIONAL MATCH (rootTk)<-[:PrimaryChild*]-(tk:Toolkit)<-[:visitTo]-(hit:PageHit)
WITH rootTk, COUNT(hit) as hits
OPTIONAL MATCH (rootTk)<-[:visitTo]-(rootHit:PageHit)
RETURN rootTk.title, hits + COUNT(rootHit)

它分两个阶段执行计数并添加值,我不确定在没有修改模型的情况下,可以在单个阶段中执行此操作。

我想你可以做到这一点,但你可能会爆炸:

MATCH (rootTk:Toolkit {level: "Level 0"})
OPTIONAL MATCH (rootTk)<-[*]-(hit:PageHit)
RETURN rootTk.title, COUNT(hit)