2016-07-07 95 views
0

我可以在neo4j中使用一些反向引用的機制嗎?我對什麼與查詢匹配不感興趣,只是在許多地方它是一樣的。例如:反向引用neo4j

MATCH (a:Event {diagnosis1:11}) 
MATCH (b:Event {diagnosis1:15}) 
MATCH (c:Event {diagnosis1:5}) 
MATCH (a)-[rel:Next {PatientID:*}]->(b) 
MATCH (b)-[rel1:Next {PatientID:\{1}]->(c) 

這個想法是,我只是需要從兩個邊緣的屬性ID是相同的,沒有指定它。它的全部目的不是產生所有可能的匹配,然後過濾它們,而只是跳到特定的地方。

我已經以更具體的方式提出了類似的問題here

編輯:我知道WHERE子句可以用於那個,但他們過濾匹配邊和節點後的查詢。我想在比賽中這樣做!

回答

4

使用簡單引用一個WHERE條款,沒有必要爲後向引用:

MATCH (a)-[rel:Next]->(b) 
MATCH (b)-[rel1:Next]->(c) 
WHERE rel.PatientID = rel1.PatientID 

更新

首先,密碼是一種聲明性的查詢語言:你表達什麼你想,運行時會以任何可能的方式來執行和優化它,所以它不會像你想象的那樣做,或者使用「back references」會神奇地解決pro blem;這只是另一種寫同一件事的方式。

所以,你的問題是,匹配創建所有的關係對之前篩選它們。如何使用WITH分兩個階段的比賽?

MATCH (a:Event {diagnosis1:11})-[rel:Next]->(b:Event {diagnosis1:15}) 
WITH a, b, rel 
MATCH (b)-[rel1:Next]->(c:Event {diagnosis1:5}) 
WHERE rel1.PatientID = rel.PatientID 

這應該只選擇匹配的第一,第二的關係,但我不知道這是否是爲O(n^2)算法Cypher支架的運行時間。

否則,如果你放棄了Java API(這將意味着一個分機或程序,這取決於你的Neo4j的版本),你也許可以在O(n)的

  • 掃描實現所有ab之間的關係,在一些multimap中將它們索引爲PatientID(參見Guava,或使用Map<K, Collection<V>>);這是O(n)
  • 然後做同樣爲所有bc,仍然之間的關係O於一個多重映射的鍵(N)
  • 迭代得到的值均與它們匹配,還是O( n)
+0

這不是我想要的,當你這樣做時,你生成了所有的匹配,然後過濾然後!這是低效的!我不想生成所有的匹配,只是那些ID相同的匹配 –

+0

我根據您的額外上下文更新了答案。 –

+0

非常感謝!我想知道是否有關於如何更改java api的一些材料。帶「WITH」的版本似乎不起作用:/。 –