2017-04-21 160 views
1

我想解決neo4j中1:多關係顯示的問題。我的數據集如下Neo4j顯示1對多關係只有一個節點

child,desc,type,parent 
1,PGD,Exchange,0 
2,MSE 1,MSE,1 
3,MSE 2,MSE,1 
4,MSE 3,MSE,1 
5,MSE 4,MSE,1 
6,BRAS 1,BRAS,2 
6,BRAS 1,BRAS,3 
7,BRAS 2,BRAS,4 
7,BRAS 2,BRAS,5 
10,NPE 1,NPE,6 
11,NPE 2,NPE,7 
12,OLT,OLT,10 
12,OLT,OLT,11 
13,FDC,FDC,12 
14,FDP,FDP,13 
15,Cust 1,Customer,14 
16,Cust 2,Customer,14 
17,Cust 3,Customer,14 
LOAD CSV WITH HEADERS FROM 'file:///FTTH_sample.csv' AS line 
CREATE(:ftthsample 
{child_id:line.child, 
desc:line.desc, 
type:line.type, 
parent_id:line.parent}); 

//Relations 
match (child:ftthsample),(parent:ftthsample) 
where child.child_id=parent.parent_id 
create (child)-[:test]->(parent) 

//Query: 
MATCH (child)-[childrel:test*]-(elem)-[parentrel:test*]->(parent) 
WHERE elem.desc='FDP' 
RETURN child,childrel,elem,parentrel 

它下面返回顯示器。

output

我要重複的節點顯示爲一個。新手與Neo4J。任何專家都可以幫忙嗎?

回答

0

這似乎是您的圖形創建查詢中的錯誤。您的查詢的幾行指定同一個節點多次,但有多個家長:

6,BRAS 1,BRAS,2 
6,BRAS 1,BRAS,3 

我猜你其實想這​​是一個節點,與父母的關係與給定的父母節點ID,而不是兩個單獨的節點。

讓我們調整您的導入查詢。我們將使用MERGE,而不是在每行上使用CREATE,而只是在child_id上,這似乎是您的主要關鍵(可能考慮只使用id,因爲節點可以擁有自己的ID,而無需考慮它是父母還是孩子的背景)。我們可以使用上創建條款MERGE後的剩餘財產僅添加如果合併導致節點創建(而不是匹配到現有的節點。

這將確保我們只有每child_id創建一個節點。

而不必再戰孩子,我們可以使用父我們剛剛創建的子節點,匹配和創建關係。我們還沒有添加line.parent爲屬性

LOAD CSV WITH HEADERS FROM 'file:///FTTH_sample.csv' AS line 
MERGE(child:ftthsample {child_id:line.child}) 
ON CREATE SET 
child.desc = line.desc, 
child.type = line.type 

WITH child, line.parent as parentId 
MATCH (parent:ftthsample) 
WHERE parent.child_id = parentId 
MERGE (child)-[:test]->(parent) 

注意。這是不需要,因爲我們只用它來創建關係,並且在關係之後臀部在那裏,我們不會再需要那些。

+0

謝謝,該作品 –

+0

對不起,你錯了。與示例不同,我的實際數據集具有我的id或連接列是字符串值..並且某些子值可能有也可能沒有父項,父項也一樣。 這可能是它拋出錯誤的原因 「無法使用null屬性值爲child_id合併節點」 我試過你在這裏提供的解決方案,但仍然拋出錯誤... http://stackoverflow.com/questions/40794877/how-to-include-properties-with-null-values-using-neo4j-merge 你可以檢查一下。對不起,再次發現你。 –

+0

你將需要有一些獨特的價值來合併。如果您的數據最初來自關係數據庫,那麼通常會有一些主鍵ID用於合併。沒有一些獨特的主鍵,您將無法合併這些節點,因爲無法分辨哪些是唯一的。你可以合併所有的屬性,而不是隻是child_id,但我不確定是否會讓你繞過錯誤。 – InverseFalcon