2015-02-11 31 views
0

我有一個數據結構,其中數據由兩種節點組成:itemclaimclaim代表關於物品的一些信息並且可以指其他物品,例如 - 某個實體位於某個其他實體中,例如, 「德國在歐洲」。示例結構:Cypher中的多步遍歷?

create 
(v1:item {id:"Q1", name: "Europe"}), 
(v2:item {id:"Q2", name: "France"}), 
(v3:item {id:"Q3", name: "Germany"}), 
(v4:item {id:"Q4", name: "Bavaria"}), 
(v5:item {id:"Q5", name: "Munich"}), 
(c1:claim:located), 
(c2:claim:located), 
(c3:claim:located), 
(c4:claim:located), 
(v5)-[:claim]->c4, 
(c4)-[:located]->v4, 
(v4)-[:claim]->c3, 
(c3)-[:located]->v3, 
(v3)-[:claim]->c2, 
(c2)-[:located]->v1, 
(v2)-[:claim]->c1, 
(c1)-[:located]->v1; 

也在http://console.neo4j.org/?id=ncbom6。現在,如果我想穿過它 - 例如找出德國或歐洲的所有項目,我該怎麼做? Cypher在這種模式下可能嗎?我知道有類似v1-[r:*]->v2的東西,但是這個假設或者是一個特定的關係或者任何關係,並且我需要claim-located對的重複模式。

回答

2

如果你想找到,例如,所有在歐洲的項目,使用控制檯中的數據:

MATCH (v:item { name: "Europe" })<-[:claim|located*]-(x:item) 
RETURN x; 

如果你也想確保路徑claimlocated關係之間嚴格穿越交替,這裏是做一個有點棘手的方式:

MATCH (v:item { name: "Europe" })<-[rel:claim|located*]-(x:item) 
WHERE REDUCE(s = 0, x IN rel | CASE 
      WHEN (s = 0 AND TYPE(x)= 'claim') 
      THEN 1 
      WHEN (s = 1 AND TYPE(x)= 'located') 
      THEN 0 
      ELSE NULL END)= 0 
RETURN x; 

,如果你需要額外的檢查,您可以修改WHEN測試。

+0

這將適用於我提供的迷你數據示例,但當然這不是真實的數據。我認爲它可以匹配索賠和所在位置的任何組合,即索賠 - 索賠 - 索賠,定位 - 索賠等。但是有沒有一種方法可以匹配特定的順序「索賠,然後定位,任何次數「? – StasM 2015-02-11 01:57:18

+0

我簡化了我的第二個查詢。 – cybersam 2015-02-13 02:06:54