嘗試剖析查詢,看看它是否真的使用了索引:
PROFILE
WITH "qwe" AS forename, "asd" AS surname
MATCH (p:Person {forename: forename, surname: surname})
RETURN p
如果沒有,你可以強制:
WITH "qwe" AS forename, "asd" AS surname
MATCH (p:Person {forename: forename, surname: surname})
USING INDEX p:Person(forename)
USING INDEX p:Person(surname)
RETURN p
正如Cypher refcard(重點煤礦提到):
當Cypher使用次優指數或更多時,可以強制執行索引使用應該使用一個索引。
另見關於USING
的章節。
更新
由於使用同一節點上的多個指標目前不支持,讓我們集中回爲什麼查詢是緩慢的,它是否真正做一些事情。您可以天寒的一個子集的實際LOAD CSV
,並查看是否有匹配的數據什麼:
PROFILE
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM 'file:///personaldata.csv' AS line1
WITH line1
LIMIT 10
OPTIONAL MATCH (p:Person {forename:line1.forename, surname:line1.surname})
RETURN p, line1.newPersonNumber
這樣的話,你可以檢查MATCH
發現的東西(即名字及姓氏不需要修整或東西) ,並且您還可以檢查哪個索引對查詢更有利:因爲只會使用1個索引,所以結果將在另一個屬性上進行過濾,並且如果使用最具判別性的索引,結果將會更快。如果所有人都是約翰,那麼最好使用姓氏上的索引,但如果他們都是,請使用姓氏上的索引。如果他們都是John的話,那麼你就有一個重複問題...無論如何,比較2個配置文件之間的過濾步驟(使用任何一個索引)的數字應該能讓你瞭解這些索引的分佈情況。
對不起,延遲迴復。 該查詢只使用一個索引,而不是兩個索引。 運行 後'使用索引p:人(用的名字) 使用索引p:人(姓)' 我得到'不支持相同的變量多次提示(3號線,13列(偏移:109)) 「使用索引p:Person(forename)「'。 我認爲指數不是問題,因爲我讓查詢運行一段時間,然後檢查是否有與該屬性是這樣的節點: 'MATCH(P:人) WHERE EXISTS(p.newPersonNumber) RETURN p',但我得到了0行返回。 – Porjaz
我已更新答案,重點關注查詢的調試和分析。 –
使用'PROFILE'我發現'MATCH'查找結果,所以我猜查詢被寫入正確。對我更有利的是有'forename'索引(就像現在這樣)。我不知道還有什麼可能是問題。另請注意,CSV文件爲4.7 GB。 – Porjaz