Neo4j只显示一个节点的1对多关系

时间:2017-04-21 15:01:10

标签: neo4j cypher graph-databases

我正在尝试解决neo4j中1:many关系显示的问题。我的数据集如下

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。任何专家都可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

这似乎是图表创建查询中的错误。您的查询中有几行指定多个相同的节点,但有多个父节点:

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

我猜你真的希望这是一个单一节点,父节点与给定父id的节点有关,而不是两个单独的节点。

让我们调整您的导入查询。我们将使用MERGE而不是在每一行上使用CREATE,而只使用child_id,这似乎是您的主键(可能只考虑使用id,因为节点可以有id本身,不必考虑它是父母还是孩子的背景。只有当MERGE导致节点创建(而不是匹配现有节点)时,我们才能在MERGE之后使用ON CREATE子句添加其余属性。

这将确保我们每个child_id只创建一个节点。

我们可以使用刚刚创建的子节点,匹配父节点,并创建关系,而不必重新匹配子节点。

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)

请注意,我们尚未添加line.parent作为属性。它不是必需的,因为我们只使用它来创建关系,并且在关系存在之后,我们将不再需要它们。