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

在这种情况下,每个rootTk表示工具包树的根。我想返回与每棵树相关的点击次数。上面的查询接近我想要的,但它不包括与每棵树的根相关的匹配项,只包括其子项。Cypher中具有多个节点的关联图案元素

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

回答

0

编辑 - 吉姆的回答 吉姆有这个问题的更好的答案,任何人发现这个问题应该使用。

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

谢谢。第一个选项奏效。 – 2014-09-26 17:53:08

1

虽然可选的比赛可以解决这个问题,一个简单的解决方案是使用零路径lenght范围的起点。这包括树中的根项目。

MATCH(rootTk:工具包{级别: “级别0”})< - [:PrimaryChild * 0 ..] - (TK:工具包)< - [:visitTo] - (命中:PageHit) RETURN rootTk。标题为标题,COUNT(hit.id)为点击数

+0

太棒了,我不知道你可以匹配零长度的路径,这是正确的答案。 – JohnMark13 2014-10-06 15:58:33

相关问题