我在浏览器客户端中运行以下查询:
MATCH (m:Media)-[r:WITH]->(:Tag {name:'peripheral'})
WITH count(r) as totes, m
WHERE m-[:WITH]->(:Tag {name: 'target'})
RETURN COUNT(*), totes, count(*)/(totes*1.0)
我正在尝试使用Tag' target'来查找媒体节点的百分比。使用Tag' peripheral'。
中的所有媒体节点Ex:媒体节点数量#' target' &安培; '外围" /#of media nodes w / just' peripheral'
除了始终返回1的变量totes
之外,大多数查询都有效。如果我将查询分开只保留前半部分,则计数是正确的 - 只有当我使用WITH和后续WHERE子句时伯爵搞砸了。有关totes
不正确的任何想法吗?
答案 0 :(得分:1)
您的查询对于您要执行的操作不正确。您的查询仅匹配Media
与名为Tag
的{{1}}个节点的关系,其中它还匹配名为peripheral
的{{1}}个节点。
我相信你真正想要的更像是......
Tag
答案 1 :(得分:1)
我对此的看法是,您的查询为每个匹配的媒体节点返回一行,因此totes
的计数始终为1.要向前传递总计数,您需要聚合返回的节点 - 因此使用COLLECT
然后UNWIND
。 Dave Bennett是正确的,虽然我相信他的第二个建议是你需要的。要打破它:
这一行得到你的初始模式匹配。
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
不要试图从之前的答案中拿走任何东西 - 只是扩展它,因为我发现有时知道为什么以及如何有用。所以这是为了我自己的利益和未来的参考! :)