Neo4j WITH 语句返回不正确的值

Neo4j WITH statement returning incorrect value

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

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)

我正在尝试找出标签为 'target' 的媒体节点在标签为 'peripheral' 的所有媒体节点中所占的百分比。

例如:带 'target' 和“外围设备”的媒体节点数量/仅带 'peripheral'

的媒体节点数量

除变量 totes 外,大多数查询都有效 returns 1. 如果我将查询分开只保留前半部分,则计数是正确的 - 只有当我使用WITH 和随后的 WHERE 子句表明计数被搞砸了。知道为什么 totes 不正确吗?

您的查询对于您要执行的操作不正确。您的查询仅匹配 Media 与名为 peripheralTag 个节点的关系,其中它还匹配 Tag 个名为 target 的节点。

我相信您真正想要的是更多类似这样的东西...

MATCH (m:Media)-[r:WITH]->(:Tag {name:'Peripheral'})
WITH count(r) as totes, collect(m) as mcol
unwind mcol as m
MATCH m-[:WITH]->(:Tag {name: 'Target'})
RETURN COUNT(*) as both, totes, count(*)/(totes*1.0)

我对此的看法是,您的查询是 return 为每个匹配的媒体节点创建一行,因此 totes 的计数将始终为 1。要将总计数向前推进,您需要聚合 returned 节点 - 因此使用 COLLECT 然后 UNWIND。 Dave Bennett 是正确的,尽管我相信他的第二个建议是您所需要的。分解:

此行获取您的初始模式匹配。

MATCH (m:Media)-[r:WITH]->(:Tag {name:'Peripheral'})

现在您需要 return 您的总数并继续收集匹配的媒体节点。仅携带 m 转发会导致您遇到的问题,即您匹配的每个媒体节点的计数为 1

WITH count(r) as totes, collect(m) as mcol

现在您可以展开您结转的媒体节点集合,将其转换回单独的行,您可以使用这些行来匹配具有标签 target[=24= 的那些媒体节点的子集]

UNWIND mcol as media
MATCH media-[:WITH]->(:Tag {name: 'Target'})

现在您应该拥有获得所需结果的所有必要信息,即标签为 'target' 的媒体节点在标签为 'peripheral'[=24 的所有媒体节点中所占的百分比=]

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

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