2015-02-09 63 views
0

我有以下查询,我在浏览器客户端上运行:Neo4j的WITH语句返回不正确的值

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) 

我试图找到标签“目标”媒体的节点了所有媒体的百分比标签为“外设”的节点。

例如:媒体节点W /“目标” &的#“外围” /媒体的节点#W /只是‘外围’

大多数查询的工作除了可变totes它总是返回1.如果我分开查询只是保持前半部分,计数是正确的 - 只有当我使用WITH和随后的WHERE子句时,计数会搞砸。任何想法为什么totes不正确?

+0

你可以通过http://console.neo4j.org共享一个示例图形来验证你描述的行为吗? – 2015-02-09 08:55:45

回答

1

我对这个问题的看法是,你的查询对每个匹配的媒体节点,因此的计数返回行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 

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

+0

感谢您的额外解释 - 作为neo4j的新手非常有帮助。这确实是第一个答案的第二个问题,你的小修改确实使它更清晰。 – Zaheer 2015-02-11 04:30:35

1

您的查询不正确你的查询只匹配MediaTag节点的关系peripheral其中它也可以ma请将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) 
+0

谢谢!第一个没有工作,仍然有手提袋返回问题1.第二个查询虽然伎俩! – Zaheer 2015-02-11 04:28:38