2015-02-06 166 views
4

我使用Cypher和我需要建立這樣的如下Neo4j的Cypher支架替代路徑

(A) ----e1----(B) 
    \   | 
    \   | 
     e3  e2 
     \  | 
      \ | 
      (C) 

其中A,B和C是節點和E1,E2和E3分別關係連接A和一個查詢B,B和C以及A​​和C.

我感興趣的是節點A和C.當e1,B和e2存在(並尊重某些屬性)或關係e3存在(和尊重一些屬性)或兩者。我的問題在於,我無法在Cypher語言中將其轉換。 爲了給有關係的標識符,我需要的MATCH子句中指定它,就像

MATCH (A)--[e1]--(B)--[e2]--(C), (A)--[e3]--(C) 

但這樣做我告訴Neo4j的兩個我都想要(E1和E3)和E2存在,並事實並非如此。但是,如果我不給這些關係一些標識符,我不能搜索他們的任何屬性。

我怎樣才能建立這樣的查詢?

謝謝。

回答

4

下面是應該返回,每行查詢時,一個不同的A和所有不同的C-節點的集合,它連接,在任一(或兩者)的方式,你都表示。

我假設A,BC都是節點標籤。

如何幹淨地展示了這種方法,這裏是一個簡單的查詢,不看屬性值

MATCH p=(a:A)-[e*1..2]-(c:C) 
WITH p, a, c, RELATIONSHIPS(p) AS rels 
WHERE LENGTH(rels) = 1 OR HEAD(TAIL(NODES(p))):B 
RETURN a, COLLECT(DISTINCT c) AS cs 

爲了對屬性值進行測試,您需要修改在兩個方面WHERE子句(在OR的任一側)。我希望這很清楚。

+0

我太專注於尋找一種方式來表達,「這存在,或者它存在」,我沒有想到的只是「崩潰」的路徑E1-E2,並在同一個元素的邊e,然後使用WHERE子句來辨別它們。 儘管我的例子過分簡化了我的問題,但我已經設法將您能想到的所有其他示例帶入您所制定的模式。 謝謝! =) – fgiacc 2015-02-07 10:41:42

+0

不客氣。我也簡化了WHERE條款中的第二個術語。 – cybersam 2015-02-07 17:33:18

相關問題