2014-04-28 69 views
7

我想在Neo4j中構建一個包含七種不同類型的節點的結構,共約4-5000個節點,並且它們之間有40000個關係。我目前使用的密碼是我首先用代碼創建節點:在neo4j中同時創建節點和關係

Create (node1:type {name:'example1', type:'example2'}) 

約4000個具有唯一節點的示例。

表述爲這樣然後我有關係:這種獨特的關係

Create 
(node1)-[:r]-(node51), 
(node2)-[:r]-(node5), 
(node3)-[:r]-(node2); 

大約40000。

隨着規模較小的圖形,這根本就沒有任何問題。但是用這個,執行查詢從不停止加載。

關於如何使這種類型的查詢工作的任何建議?或者我應該做什麼呢?

編輯。我試圖構建的是一個產品的大圖,它的發佈,發佈版本,功能等與電影圖形示例構建的方式相同。

該產品共有約6個版本,每個版本都有大約20個發行版本。總共有371個功能和371個功能,還有438個功能轉換。一次發佈版本(總共120次),然後每個版本大約有2-300個特色版本。這些Featureversions被映射到它的特性,這些特性對db中的一切都有依賴性。我也involed HW相關性,如可能的硬件上運行這些功能,使用暗號代碼等設備上,以便basicaly IM版本,例如:

Create (Product1:Product {name:'ABC', type:'Product'}) 
Create (Release1:Release {name:'12A', type:'Release'}) 
Create (Release2:Release {name:'13A, type:'release'}) 
Create (ReleaseVersion1:ReleaseVersion {name:'12.0.1, type:'ReleaseVersion'}) 
Create (ReleaseVersion2:ReleaseVersion {name:'12.0.2, type:'ReleaseVersion'})  

和低於我已經構建起來使用

Create (Product1)<-[:Is_Version_Of]-(Release1), 
(Product1)<-[:Is_Version_Of]-(Release2), 
(Release2)<-[:Is_Version_Of]-(ReleaseVersion21),   

所有到功能的方式,然後我還添加了它們之間的相關性,如:

(Feature1)-[:Requires]->(Feature239), 
(Feature239)-[:Requires]->(Feature51);  

因爲我已經找到許多不同的Excel表è所有這些信息tc,我這樣做了代碼,以爲我可以把它放在一個大規模密碼查詢中,並在本地主機上的/瀏覽器上運行它。只要我一次不使用超過4-5000個查詢,它就非常好用。然後它最多在5-10秒內創建完整的數據庫,但現在當我試圖在同一時間運行45000個查詢時,它已經運行了將近24小時,並且仍在加載並且正在執行查詢。 ..「。我想知道是否可以改進所需的時間,數據庫最終是否會創建?或者我可以做一些更聰明的索引或其他東西來改善性能?因爲順便說一句,我的密碼是現在寫的,我不能將它分成幾部分,因爲數據庫中的所有內容都與產品有某種連接。我是否需要重寫代碼或者是否有任何順暢的方法?

回答

11

您可以創建一個單個create語句相通的多個節點和關係,是這樣的:

create (a { name: "foo" })-[:HELLO]->(b {name : "bar"}), 
     (c {name: "Baz"})-[:GOODBYE]->(d {name:"Quux"}); 

所以這是一個方法,而不是用一個語句單獨創建每個節點,然後用一個單一的每個關係聲明。

您還可以通過先匹配,然後創建創建對象的多種關係:

match (a {name: "foo"}), (d {name:"Quux"}) create (a)-[:BLAH]->(d); 

當然你可以有多個match子句和多個創建條款存在。

您可能會嘗試匹配給定類型的節點,然後從該類型的節點創建所有必需的關係。你有足夠的關係,這將需要許多查詢。確保你已經爲你用來匹配節點的屬性建立索引。隨着數據庫變得越來越大,這對於快速查找您嘗試創建新關係的事情來說非常重要。

您尚未指定您正在運行的不是「停止加載」的查詢。更新你的問題的具體細節,讓我們知道你已經嘗試過,也許可以幫助。

+0

謝謝!這應該被接受爲答案 – troig

+0

我們不需要括號嗎? (a) - [:BLAH] - >(b) – orestiss

+0

是的。答案是在2014年寫的,當你不需要它們的時候。 – FrobberOfBits

0

如果您能夠使用Neo4j 2.1預發佈里程碑,那麼您應該嘗試使用新的LOAD CSVPERIODIC COMMIT功能。它們專爲這種用例而設計。

LOAD CSV允許您使用一個或多個Cypher模式描述數據結構,同時提供CSV值以避免重複。

PERIODIC COMMIT可幫助大型導入更可靠,並通過減少所需的內存量來提高性能。

+0

這看起來像是一件非常有趣的事情,我唯一的問題是如果我可以使用例如特徵和特徵之間的關係,並且它們之間具有不同種類的關係,因爲在這個數據庫中有相同類型的節點可能具有十種不同的關係到同一類型的節點。所以我不能使用: CREATE(p) - [:PLAYED {role:csvLine.role}] - >(m)' 或者我能否在我的時間運行一些數據庫?因爲這可能是我目前的問題,所以我不能把它分成小塊。 – ErikOstergren

+0

關係類型,標籤和屬性名稱必須在查詢中逐字指定 - 關係類型不能來自CSV文件。相反,您通常會使用一個CSV文件和每種類型的一個查詢。 – Andres