2016-11-18 251 views
0

我有一個包含數百萬個節點的標籤Person。節點有一些屬性,我試圖從一個CSV文件添加一個新的屬性到節點。 我想通過人的姓和名匹配他們,但查詢太慢。查詢是:Neo4j將屬性從CSV添加到節點

USING PERIODIC COMMIT LOAD CSV WITH HEADERS FROM 'file:///personaldata.csv' AS line1 MATCH (p:Person {forename:line1.forename, surname:line1.surname}) SET p.newPersonNumber=line1.newPersonNumber

我離開也許一個小時運行查詢之前我終止它。 我做錯了什麼? 請注意,我有索引forenamesurname

回答

0

嘗試剖析查詢,看看它是否真的使用了索引:

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個配置文件之間的過濾步驟(使用任何一個索引)的數字應該能讓你瞭解這些索引的分佈情況。

+0

對不起,延遲迴復。 該查詢只使用一個索引,而不是兩個索引。 運行 後'使用索引p:人(用的名字) 使用索引p:人(姓)' 我得到'不支持相同的變量多次提示(3號線,13列(偏移:109)) 「使用索引p:Person(forename)「'。 我認爲指數不是問題,因爲我讓查詢運行一段時間,然後檢查是否有與該屬性是這樣的節點: 'MATCH(P:人) WHERE EXISTS(p.newPersonNumber) RETURN p',但我得到了0行返回。 – Porjaz

+0

我已更新答案,重點關注查詢的調試和分析。 –

+0

使用'PROFILE'我發現'MATCH'查找結果,所以我猜查詢被寫入正確。對我更有利的是有'forename'索引(就像現在這樣)。我不知道還有什麼可能是問題。另請注意,CSV文件爲4.7 GB。 – Porjaz