2016-05-03 71 views
0

我有其中每一個節點具有標籤A或B的曲線圖進行查詢時,並且對於每個標籤上的id屬性的索引指數慢:Neo4j的跨越2個標籤

CREATE INDEX ON :A(id); 
CREATE INDEX ON :B(id); 

在該圖中,我想找到ID爲「42」的節點,但我不知道該標籤。爲此,我正在執行以下查詢:

MATCH (n {id:"42"}) WHERE (n:A OR n:B) RETURN n; 

但是,此查詢需要6秒才能完成。然而,做任一:

MATCH (n:A {id:"42"}) RETURN n; 
MATCH (n:B {id:"42"}) RETURN n; 

只需要~10ms。

我是不是正確表達我的查詢?什麼是正確的方式來制定它,以便利用已安裝的指數?

回答

2

這是使用兩個索引的一種方法。 result將是匹配節點的集合。

OPTIONAL MATCH (a:B {id:"42"}) 
OPTIONAL MATCH (b:A {id:"42"}) 
RETURN 
    (CASE WHEN a IS NULL THEN [] ELSE [a] END) + 
    (CASE WHEN b IS NULL THEN [] ELSE [b] END) 
    AS result; 

您應該使用PROFILE來驗證您的Neo4j的環境中執行計劃使用的NodeIndexSeek操作都OPTIONAL MATCH條款。如果沒有,您可以使用USING INDEX子句給Cypher一個提示。

1

索引是通過節點標籤和屬性形成和使用的,要使用它們,您需要以同樣的方式形成查詢。這意味着查詢不帶標籤將使用您得到的結果掃描所有節點。

2

您應該使用UNION來確保使用兩個索引。在你的問題中,你幾乎得到了答案。

MATCH (n:A {id:"42"}) RETURN n 
UNION 
MATCH (n:B {id:"42"}) RETURN n 
; 

這將工作。要檢查查詢使用配置文件或在查詢語句之前解釋是否使用索引。