2014-09-23 81 views
3

使用Neo4j的2.1.4和SDN 3.2.0.RELEASENeo4j的關係結構中索引

我有與具有與其相關聯的UUID關係連接節點的圖。外部系統使用UUID作爲識別關係來源和目標的手段。在Spring Data Neo4j(SDN)中,我們有一個@RelationshipEntity(type=」LINKED_TO」)類,其中@StartNode,@EndNode和字符串uuid字段。所述uuid字段是@Indexed和作爲

neo4j-sh (?)$ SCHEMA 
==> Indexes 
... 
==> ON :Link(uuid) ONLINE 
... 

在Neo4j的所得模式定義顯示出來。然而,運行鍼對數據,例如一個暗號查詢

MATCH()-[r:LINKED_TO]->() WHERE uuid=’XXXXXX’ RETURN r; 

做數據庫的全掃描和需要很長的時間

如果我試圖通過運行

MATCH()-[r:LINKED_TO]->() USING INDEX r:Link(uuid) WHERE uuid=’XXXXXX’ RETURN r; 

使用索引我得到

SyntaxException: Type mismatch: expected Node but was Relationship. 

正如我瞭解它,關係應該是一等公民在Neo4j中,但我看不到如何利用關係上的索引來防止對數據庫進行表掃描的圖表等同於查找關係。

我知道有類似How to use relationship index in Cypher這樣的帖子要求類似的東西,但是這個鏈接兩個節點之間的關係。如果我將鏈接轉換爲節點,我們將創建一個節點來表示當我們在圖形數據庫中工作時看起來錯誤的關係 - 我最終會用()-[:xxx]->(:Link)-[:xxx]->()來表示一個關係。它會使模型變得混亂,純粹是因爲鏈接不能被表示爲一種關係。

Link已經獲得了我想要使用的獨特的共享密鑰。 Schema輸出表明該字段的索引在那裏 - 我無法使用它。

有沒有人有任何建議?

非常感謝,

戴夫

+0

我不明白。你的'uuid'是**節點**屬性還是**關係**屬性?根據你的模式,你有一個關於':Link(uuid)'的索引,其中'Link'是一個只能存在於**節點**上的標籤。但在第二個查詢中,您將標籤放在**關係旁邊(這也解釋了您的SyntaxException)。 – 2014-09-23 18:33:41

+0

'uuid'是**關係**屬性。我認爲,在@RelationshipEntity(type =「LINKED_TO」)public class Link中添加一個'@Indexed(unique = true)String uuid'會導致SDN在(n:Link)上執行'create constraint' assert n.uuid是唯一的,正如你所說,它實際上是在一個標籤爲'Link'的節點上創建一個約束 - 因此它不起作用。我認爲這是SDN中的一個錯誤 - 它不應該允許在@ @ RelationshipEntity上使用@ Indexed。但是關於如何在「鏈接」關係上對屬性進行索引仍然存在整個問題。 – 2014-09-23 19:43:55

回答

1

架構指標只適用於節點。索引關係的唯一方法是使用傳統索引或自動索引。傳統指標需要在START子句中明確使用:

START r=relationship:my_index_name(uuid=<myuuid>) 
RETURN r 

我不知道如何能與SDN一起使用。

備註:要求關係索引幾乎總是表示在圖數據模型中做錯了事。一切都是thing或在您的域中具有身份應該是一個節點。所以如果一個關係需要一個uuid,也許這個關係指的是一個東西,因此應該被轉換成一個節點,這個節點與前一個開始節點具有入站關係,並且具有與前一個末端節點的出站關係。