2015-02-09 64 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