2016-11-08 85 views
0

我擁有數百萬個節點的人員和公司標籤。 我正嘗試創建一個關係: (person)-[:WORKS_AT]->(company)根據兩個標籤中存在的唯一公司編號屬性。 我試圖用下面的查詢來做到這一點: MATCH (company:Company), (person:Person) WHERE company.companyNumber=person.comp_number CREATE (person)-[:WORKS_AT]->(company)
但這個查詢需要很長時間才能執行並最終失敗。 我有索引companyNumbercomp_number。 所以,我的問題是:它有一種方法來創建段的關係,例如(50000,然後再50000等...)?Neo4j將大量關係添加到已有的節點

回答

0

使用臨時標籤將事情標記爲已完成,並在創建關係之前添加限制步驟。當你全部完成後,只需從每個人中刪除標籤。

MATCH (company:Company) 
WITH company 
MATCH (p:Person {comp_number: company.companyNumber}) 
WHERE NOT p:Processed 
WITH company, p 
LIMIT 50000 
MERGE (p) - [:WORKS_AT] -> (company) 
SET p:Processed 
RETURN COUNT(*) AS processed 

這將返回已處理行的數量(通常爲50000)當它返回小於50000(或任何你設定的限制)時,你都完成了。直到你得到的結果小於50000你或許可以把所有這些數字可達10或者更多,這取決於你的數據庫設置

MATCH (n:Processed) 
WITH n LIMIT 50000 
REMOVE n:Processed 
RETURN COUNT(*) AS processed 

:運行這個傢伙呢。

+0

請注意,有一個APOC過程[apoc.periodic.iterate()](https://neo4j-contrib.github.io/neo4j-apoc-procedures/#_apoc_periodic_iterate),可以幫助批量處理它,因此它不會不必手動完成。由於我在使用a:Tore解決方案中使用a:Processed標籤時自己嘗試時遇到的一些潛在錯誤,因此我現在不會將其作爲實際答案提交。如果他們修復它,我會提交它作爲一個可行的解決方案。 – InverseFalcon