2017-04-21 121 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

相关问题