2014-09-04 121 views
6

我有以下兩個節點類型:獲取不具有一定的關係(CYPHER/Neo4j的)節點

c:City {name: 'blah'} 
s:Course {title: 'whatever', city: 'New York'} 

展望創建此:

(s)-[:offered_in]->(c) 

我試圖讓所有不與城市聯繫並創建與城市的關係的課程(如果不存在,則創建城市)。然而,問題是我的數據集大約有500萬個節點,而且我的任何查詢都超時(除非我的增量爲10k)。

......有人有什麼建議嗎?

編輯:

這裏是我現在正在運行的任務查詢(即在10K塊做(出數以百萬計),因爲它需要幾分鐘的時間,因爲它是沒有按是否創建城市。 「T存在):

match (j:Job) 
where not has(j.merged) and has(j.city) 
WITH j 
LIMIT 10000 
MERGE (c:City {name: j.city}) 
WITH j, c 
MERGE (j)-[:in]->(c) 
SET j.merged = 1 
return count(j) 

(現在不知道過濾掉已經匹配的那些一個好辦法,所以試圖做到這一點通過自定義標記是‘合併’我已經有一個屬性index on)

+0

你能分享你目前正在嘗試的嗎? – JohnMark13 2014-09-04 17:22:04

+0

我不認爲這可以在沒有更多上下文的情況下得到回答(並且將您的問題與您的更新相匹配,我假設工作==課程和== offered_in)。您是使用現有數據進行操作還是這是批量導入?你能告訴我們關於你的系統設置的一些信息嗎?而不是'合併',你可以使用WHERE NOT(j) - [:in] - >()。 – JohnMark13 2014-09-04 19:22:52

+0

您是否通過瀏覽器界面看到超時? – 2014-09-04 21:40:41

回答

2

500000是一個公平的f新節點和你提出的另外90%的問題沒有你想在這裏創建的關係,所以這需要一些時間。如果沒有您的系統(規格,新安裝,編程環境)和更多的知識,當你運行這個(舊數據或插入),這只是在一個整潔的解決方案的最佳猜測:

MATCH (j:Job) 
WHERE NOT (j)-[:IN]->() AND HAS(j.city) 
MERGE (c:City {name: j.city}) 
MERGE (j)-[:IN]->(c) 
return count(j) 

很明顯,你可以根據需要添加限制。

+0

它是5,000,000個節點。由於某種原因,我有(和這一個)的查詢產生噸重複城市... 我已經放棄,只是寫了一個python腳本手動做小塊。將永遠佔用,但似乎具有獨特性,並做我需要的東西。 在一個相關的說明中,我試着玩「CREATE UNIQUE」(因爲這個應該保證件的唯一性),但它一直告訴我「不受限制的模式」或不應該使用它方式(或沿着這些線),所以從來沒有得到那個工作。 – Diaspar 2014-09-05 20:26:00

+1

您定義了哪些索引,並且如上所述使用了兩個合併語句?由於無匹配的未綁定模式,單個合併('MERGE(j) - [:IN] - >(c:City {name:jcity})')會產生重複。你能否用更多的信息更新你的問題(你曾經嘗試過什麼,失敗了),因爲這應該是完全可能的! – JohnMark13 2014-09-06 07:08:55

相關問題