我对这个问题的看法是,你的查询对每个匹配的媒体节点,因此的计数返回行totes
将始终为1.要向前传送总计数,您需要汇总返回的节点 - 因此使用COLLECT
,然后使用UNWIND
。戴夫贝内特是正确的,但我相信他的第二个建议是你需要的。分解:
这条线获得您的初始模式匹配。
MATCH (m:Media)-[r:WITH]->(:Tag {name:'Peripheral'})
现在您需要返回您的总数并继续匹配媒体节点的集合。只需携带m
向前导致你有问题,即得到的1计数为每个媒体节点你匹配
WITH count(r) as totes, collect(m) as mcol
现在你可以放松媒体的节点,你携带着它重新变换各个行的集合你可以用它来搭配具有标签的那些媒体节点的子集target
UNWIND mcol as media
MATCH media-[:WITH]->(:Tag {name: 'Target'})
现在你应该拥有所有必要的信息,以获取你的愿望,即媒体的节点与标签的百分比结果“目标'用标签'外围'
从所有媒体节点中删除
RETURN COUNT(*) as both, totes, COUNT(*)/(totes*1.0)
对于其他读者可能值得指出(totes*1.0)
是必要的强制其中一个参数是一个浮动。如果没有这样做,那么将发生整数运算,您将得到0或1!我也觉得它更多的表现表明,我聚集了精确表达式,所以return语句会成为
RETURN COUNT(media) as both, totes, COUNT(media)/(totes*1.0)
,并表示可以使用
RETURN COUNT(media) as both, totes, COUNT(media)/(totes*1.0)*100
唯一的其他东西会实际的百分比要通过推进第二计明确
WITH COUNT(media) as both, totes
RETURN both, totes, both/(totes*1.0)*100
所以把它放在一起就变成
MATCH (m:Media)-[r:WITH]->(:Tag {name:'Peripheral'})
WITH count(r) as totes, collect(m) as mcol
UNWIND mcol as media
MATCH media-[:WITH]->(:Tag {name: 'Target'})
WITH COUNT(media) as both, totes
RETURN both, totes, both/(totes*1.0)*100
没有试图从以前的答案中取出任何东西 - 只是扩展它,因为我发现有时知道为什么以及如何。所以这是为了我自己的利益和未来的参考! :)
你可以通过http://console.neo4j.org共享一个示例图形来验证你描述的行为吗? – 2015-02-09 08:55:45