2015-01-09 21 views
1

我創建的圖形包含大量的大致樹狀結構的子圖,因爲每個子圖的「根」只具有外向關係。該子圖的許多葉子和分支都包含與根相關的數據。這是爲了讓類似下面的單查詢將返回與給定根關聯的所有數據,並僅與根相關的數據:如何在neo4j中不使用標籤而部分隔離子圖形

MATCH (root:ROOT {id: 'foo'})-[*]->(leaves) RETURN leaves 

有非常充分的理由來優化這個查詢。然而,子圖不是真正的隔離,因爲有些葉子實際上是可以接收來自許多根關係的類別,因此結構類似這樣的存在:

(root)-[]->(category)<-[]-(root) 

這似乎是一個偉大的方式來保存的完整性同時也允許它們之間的複雜關係,但是,有一個問題。我不能在根之間直接建立簡單的一對一關係,或者一個根會污染對方對第一個查詢的響應。正如我所看到的,只有兩個真正的選擇。

  1. 爲根之間的每個1對1關係構建一個新的虛擬節點。像這樣:

    (根) - [] - >(虛設)< - [] - (根)

    我討厭這個選項。它氾濫無用的節點,它稀釋了關係的概念。

  2. 給每個子圖的每個孩子一個標籤,標識它是子圖的一個成員。這是我看到的更糟糕的選擇。由於數以千計的子圖編號會嚴重污染標籤空間。

我也考慮過濾一個直接關係的標籤,但只排除外國的根,而不是它的子女。請看下圖:

過濾器直接1對1的關係的標籤上有這樣的結構:

(root)-[:bar]->(foreign_root)-[]->(foreign_leaves) 

和主查詢是這樣的:

MATCH (root {id: 'foo'})-[*]->(leaves) WHERE NOT (root)-[:bar]->(leaves) RETURN leaves 

可生產的結果(foreign_leaves)由於多種原因,這是不理想的,因爲它使得最重要的查詢變大,並且實際上並沒有隔離圖形。

因此,從某種意義上說,我問,是否有辦法在兩個根之間創建一個直接的1對1關係,而沒有嚴重的圖形污染或子圖之間的交叉污染?從更大的意義上說,我是否錯誤地看待問題?

+0

我會在樹內或樹之間或從類別到類別中使用顯式的rel-types。然後使用顯式的rel-types編寫你的查詢。 – 2015-01-10 19:05:23

回答

2

我想你幾乎就在那裏。在最後一個Cypher查詢中,可以調整WHERE子句,以便它不會實例化:bar關係的目標節點。就像這樣:

MATCH (root {id: 'foo'})-[*]->(leaves) 
WHERE NOT (root)-[:bar]->() 
RETURN leaves 

這樣,你過濾掉了:bar關係開始所有路徑。