使用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輸出表明該字段的索引在那裏 - 我無法使用它。
有沒有人有任何建議?
非常感謝,
戴夫
我不明白。你的'uuid'是**節點**屬性還是**關係**屬性?根據你的模式,你有一個關於':Link(uuid)'的索引,其中'Link'是一個只能存在於**節點**上的標籤。但在第二個查詢中,您將標籤放在**關係旁邊(這也解釋了您的SyntaxException)。 – 2014-09-23 18:33:41
'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