2014-10-07 105 views
0

我有這樣的表達:添加路徑網絡

MATCH (g:GNE{sym:"ST1"})-[:like]->(c:CLUSTER)<-[:Belong]-(h:GNE) 
WITH h, COUNT(c) AS score, COLLECT(c.clusterInfo) AS info 
ORDER BY score DESC 
WHERE score >= 4 
RETURN h.sym, score, info, h.chr 

所以,我想增加更多的追蹤圖形,喜歡這句話:

(c:CLUSTER)-[:has]-(v:ORTH) where v.Term are equal in all CLUSTER 

有什麼建議? 謝謝!

+0

這將是巨大的,如果你可以設置(http://gist.neo4j.org)中添加了一些數據,因爲我已經看到您在該域中提出了多個問題。所以其他人更容易跟隨和推理你的模型。無論如何,這將是很酷:) – 2014-10-08 00:28:22

+0

這是作爲一個過濾器嗎?即只有v.term在所有收集的羣集中相等才能返回結果?是v.term需要等於查詢參數的值? – JohnMark13 2014-10-08 08:20:17

回答

0

這是一個未經測試的建議。

MATCH (g:GNE{sym:"ST1"})-[:like]->(c:CLUSTER)<-[:Belong]-(h:GNE) 
WITH h, c 
MATCH (c:CLUSTER)-[:has]-(v:ORTH) 
WITH v, h, COUNT(c) AS score, COLLECT(c.clusterInfo) AS info 
WHERE v.Term are equal in all CLUSTER 
ORDER BY score DESC 
WHERE score >= 4 
RETURN h.sym, score, info, h.chr 

或者:

MATCH (g:GNE{sym:"ST1"})-[:like]->(c:CLUSTER) // Find 'c', we don't need 'g' after this 
WITH c 
MATCH (v:ORTH)-[:has]-(c:CLUSTER)<-[:Belong]-(h:GNE) // From 'c', find the datums of interest 
WITH v, h, COUNT(c) AS score, COLLECT(c.clusterInfo) AS info 
WHERE v.Term are equal in all CLUSTER 
ORDER BY score DESC 
WHERE score >= 4 
RETURN h.sym, score, info, h.chr 
+0

在所有CLUSTER中WHERE v.Term是否相等? – JohnMark13 2014-10-08 08:53:07

+0

我不知道。這是OP – Stewart 2014-10-08 16:52:05

+0

中提到的特定的WHERE條款哦,我知道,你的意思是這不是語法。道歉。我認爲這是一些模糊的集合類型Cypher語法,因爲它被格式化爲原始問題中的代碼。如果它是僞代碼,那麼我不得不承認我不完全明白它試圖展示的意圖。 – Stewart 2014-10-08 16:54:14

1

要通過一個額外的參數來篩選結果:

MATCH (g:GNE{sym:"ST1"})-[:like]->(c:CLUSTER)<-[:Belong]-(h:GNE) 
WITH h, c 
MATCH (c:CLUSTER)-[:has]-(v:ORTH{term:"Your Value"}) 
WITH h, COUNT(c) AS score, COLLECT(c.clusterInfo) AS info 
ORDER BY score DESC 
WHERE score >= 4 
RETURN h.sym, score, info, h.chr 

如果你硬是要爲v.term是相同的所有值(但你不知道提前值是什麼),那麼它會更復雜一點,我認爲你將不得不使用WHERE ALL集合謂詞來比較ORTH節點集合中的term屬性。

MATCH (g:GNE{sym:"ST1"})-[:like]->(c:CLUSTER)<-[:Belong]-(h:GNE) 
WITH h, c 
MATCH (c:CLUSTER)-[:has]-(v:ORTH) 
WITH h, COUNT(c) AS score, COLLECT(c.clusterInfo) AS info, COLLECT(v) as orths 
ORDER BY score DESC 
WHERE ALL(orth IN TAIL(orths) WHERE (orth.term = HEAD(orths).term)) 
AND score >= 4 
RETURN h.sym, score, info, h.chr 

如果這是你希望它可以更快地打破了頭和尾收集修飾符到一個單獨的並運用的長度過濾器的第一件事:

MATCH (g:GNE{sym:"ST1"})-[:like]->(c:CLUSTER)<-[:Belong]-(h:GNE) 
WITH h, c 
MATCH (c:CLUSTER)-[:has]-(v:ORTH) 
WITH h, COUNT(c) AS score, COLLECT(c.clusterInfo) AS info, COLLECT(v) as orths 
WHERE score >= 4 
WITH h, score, info, TAIL(orths) as orhttail, HEAD(orths) as orthhead 
WHERE ALL(orth IN orthtail WHERE (orth.term = orthead.term)) 
RETURN h.sym, score, info, h.chr