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
与名为 peripheral
的 Tag
个节点的关系,其中它还匹配 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
不试图从以前的答案中拿走任何东西 - 只是扩展它,因为我发现有时知道为什么以及如何是有用的。所以这是为了我自己的利益和未来的参考! :)
我在浏览器客户端中 运行 有以下查询:
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
与名为 peripheral
的 Tag
个节点的关系,其中它还匹配 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
不试图从以前的答案中拿走任何东西 - 只是扩展它,因为我发现有时知道为什么以及如何是有用的。所以这是为了我自己的利益和未来的参考! :)