我正在尝试解决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
返回如下显示。
我希望将重复的节点显示为一个。新手与Neo4J。任何专家都可以帮忙吗?
答案 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
作为属性。它不是必需的,因为我们只使用它来创建关系,并且在关系存在之后,我们将不再需要它们。