我對這個問題的看法是,你的查詢對每個匹配的媒體節點,因此的計數返回行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
沒有試圖從以前的答案中取出任何東西 - 只是擴展它,因爲我發現有時知道爲什麼以及如何。所以這是爲了我自己的利益和未來的參考! :)
你可以通過http://console.neo4j.org共享一個示例圖形來驗證你描述的行爲嗎? – 2015-02-09 08:55:45