Neo4j WITH语句返回不正确的值

时间:2015-02-09 03:38:33

标签: neo4j

我在浏览器客户端中运行以下查询:

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不正确的任何想法吗?

2 个答案:

答案 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

不要试图从之前的答案中拿走任何东西 - 只是扩展它,因为我发现有时知道为什么以及如何有用。所以这是为了我自己的利益和未来的参考! :)