【问题标题】:Neo4j : create relationship between two or more nodes having the same LabelNeo4j:在具有相同标签的两个或多个节点之间创建关系
【发布时间】:2015-08-26 11:47:37
【问题描述】:

我有一个包含活动的 csv 文件(流程图):

startActivityId,Name,endActivityId
 1,A,2
 2,B,3
 3,C,4
 4,D,5

让它看起来像这样:A->B->C->D 我将 csv 文件成功导入 neo4j 服务器:使用此 Cypher 查询:

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:path/graph/activity.csv" AS row
CREATE (:Activity {startactivityId:row.startActivityId, Name: row.Name, endActivityId: row.endActivityId});

然后我在 startactivityId 上创建了一个索引:

CREATE INDEX ON :activity(startActivityId);

然后我想创建这些节点之间的关系,所以尝试了这个密码查询:

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:path/graph/activity.csv" AS row
MATCH (startActivity:Activity {startActivityId: row.startActivityId})
MATCH (endActivity:Activity {startActivityId: row.endActivityId})
MERGE (startActivity)-[:LINKS_TO]->(endActivity);`

但没有建立任何关系,什么也没有发生

我确定我错过了一些东西,因为我是 cypher 的新手,但我无法弄清楚。

有什么想法吗?

【问题讨论】:

  • 你在你的 csv 和查询中混合了大写/小写,例如 startActivityId 在 csv 中但 row.startactivityId 在查询中,节点属性 startactivityId 在创建查询中但 startActivityId在比赛中。如果你解决它,它会起作用吗?
  • 不,我在写这个问题时在这里犯了错误,但是在密码中它是正确的,
  • 我的查询结构是否正确?
  • 这是您的 csv 文件实际的样子,还是只是为了在此处发布而对其进行了对齐?因为如果这就是您的文件的样子,那么您的属性值中将有一堆空格,并且这些空格没有匹配的startActivityIdendActivityIdMATCH (n:Activity) RETURN n 告诉你什么?
  • 不,我只是为了让这里看起来更易读而对齐,没有空格

标签: neo4j cypher


【解决方案1】:

我复制了您更新后的 csv(并删除了第一列顶部的空格)并运行了您的查询。

neo4j-sh (?)$ USING PERIODIC COMMIT LOAD CSV WITH HEADERS FROM "file:///Users/jonatan/src/doc/stackexchange/32225817.pdc" as row CREATE (:Activity {startActivityId:row.startActivityId, name:row.Name, endActivityId:row.endActivityId});                                            
+-------------------+
| No data returned. |
+-------------------+
Nodes created: 4
Properties set: 12
Labels added: 4
115 ms

neo4j-sh (?)$ USING PERIODIC COMMIT LOAD CSV WITH HEADERS FROM "file:///Users/jonatan/src/doc/stackexchange/32225817.pdc" as row MATCH (s:Activity {startActivityId:row.startActivityId}) MATCH (e:Activity {startActivityId:row.endActivityId}) MERGE (s)-[r:LINKS_TO]->(e) RETURN r;
+-------------------+
| r                 |
+-------------------+
| :LINKS_TO[2084]{} |
| :LINKS_TO[2085]{} |
| :LINKS_TO[2086]{} |
+-------------------+
3 rows
Relationships created: 3
178 ms

创建了三个关系。为了确认它们是正确的关系,我匹配并返回路径(:Activity)-[:LINKS_TO]->()

neo4j-sh (?)$ MATCH p=(:Activity)-[:LINKS_TO]->() RETURN p;         
+-------------------------------------------------------------------------------------------------------------------------------------------+
| p                                                                                                                                         |
+-------------------------------------------------------------------------------------------------------------------------------------------+
| [Node[1415]{name:"A",startActivityId:"1",endActivityId:"2"},:LINKS_TO[2084]{},Node[1416]{name:"B",startActivityId:"2",endActivityId:"3"}] |
| [Node[1416]{name:"B",startActivityId:"2",endActivityId:"3"},:LINKS_TO[2085]{},Node[1417]{name:"C",startActivityId:"3",endActivityId:"4"}] |
| [Node[1417]{name:"C",startActivityId:"3",endActivityId:"4"},:LINKS_TO[2086]{},Node[1418]{name:"D",startActivityId:"4",endActivityId:"5"}] |
+-------------------------------------------------------------------------------------------------------------------------------------------+
3 rows
49 ms
neo4j-sh (?)$ 

在我看来还可以,但不确定什么不适合你。

MATCH p=(:Activity)-[r]->() RETURN p; 告诉你什么?

【讨论】:

  • 嘿,只是一个问题,有时我在表示中没有得到那个圆圈内的名称(neo4j 服务器管理工​​具),我如何选择一个属性出现在圆圈内?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多