使用 LOAD CSV 创建数组中每个节点之间的关系
Create Relationship between each Node in Array while using LOAD CSV
我有给定的 CSV 文件:
1,2016-10-09T21:14:44Z,Anna Long,"[{"_id": "1", "objectType": "primaryTag"}]"
2,2016-10-10T14:03:51Z,Jonathan Collier,"[{"_id": "2", "objectType": "primaryTag"}, {"_id": "3", "objectType": "secondaryTag"}]"
3,2016-10-09T21:42:35Z,Michelle Wheeler,"[{"_id": "4", "objectType": "primaryTag"}, {"_id": "5", "objectType": "secondaryTag"}, {"_id": "6", "objectType": "secondaryTag"}]"
现在我尝试从 CSV 文件中的 JSON 数组创建节点和关系。
我可以使用此命令导入 CSV 文件:
LOAD CSV FROM file:///<my_file> AS row
此外,我可以通过以下查询获得 JSON 数组:
WITH apoc.convert.fromJsonList(row[3]) AS tags
现在我想为 CSV 文件中的每一行分别在 JSON 数组中的每个标签之间创建关系。
作为示例,让我们从 CSV 文件中获取第三行。我们在 JSON 数组中有 3 个对象,因此我想创建 3 个关系。 id为4&5、4&6、5&6的标签之间的关系
可悲的是,我完全被困在这里,不确定我是否必须使用 UNWIND 或 FOREACH.
编辑
我解决问题如下(所有相关节点已经导入数据库):
LOAD CSV FROM file:///<my_file> AS row
MATCH (q:Question {id: row[0]})--(t1:Tag)
WITH COLLECT(t1) AS tags, row[0] AS question_id
FOREACH (i IN range(0, size(tags) - 2) |
FOREACH (node1 IN [tags[i]] |
FOREACH (j IN range(i+1, size(tags) - 1) |
FOREACH (node2 IN [tags[j]] |
MERGE (node1)-[c:CONNECTED_TO]-(node2)
)
)
)
)
代码有效,但有 4 个 FOREACH 循环。我仍然相信有更漂亮的方法。所以请随时回答我的问题。
首先要意识到您还没有节点可以使用,您只有对象。您需要转换(MATCH、MERGE 或 CREATE)与这些关联的节点。
我们以最简单的情况为例,每次都创建新节点,并设置所有属性
LOAD CSV FROM file:///<my_file> AS row
WITH apoc.convert.fromJsonList(row[3]) AS tags
UNWIND tags as tag
CREATE (t:Tag)
SET t = tag // assigns map properties to node properties
WITH row, collect(t) as tagNodes
CALL apoc.nodes.link(tagNodes, 'REL')
RETURN count(*)
我正在使用来自 APOC Procedures 的 apoc.nodes.link()
轻松创建列表中所有节点之间的关系。但是如果你没有 APOC 或者不能使用它,你将不得不使用一些替代方法。
请参阅 creating and working with linked lists in Cypher
上的这篇知识库文章
编辑
所以我错过了关于你想要在所有节点组合之间创建关系的部分,而不仅仅是通过它们的链表。
我们可以使用 apoc.coll.combinations()
获取列表中 2 个节点的每个组合,并在它们之间创建关系:
LOAD CSV FROM 'file:///<my_file>' as row
WITH row, apoc.convert.fromJsonList(row[3]) AS tags
UNWIND tags as tag
CREATE (t:Tag)
SET t = tag // assigns map properties to node properties
WITH row, collect(t) as tagNodes
UNWIND apoc.coll.combinations(tagNodes, 2) as pair
WITH pair[0] as start, pair[1] as end
CREATE (start)-[:REL]->(end)
我有给定的 CSV 文件:
1,2016-10-09T21:14:44Z,Anna Long,"[{"_id": "1", "objectType": "primaryTag"}]"
2,2016-10-10T14:03:51Z,Jonathan Collier,"[{"_id": "2", "objectType": "primaryTag"}, {"_id": "3", "objectType": "secondaryTag"}]"
3,2016-10-09T21:42:35Z,Michelle Wheeler,"[{"_id": "4", "objectType": "primaryTag"}, {"_id": "5", "objectType": "secondaryTag"}, {"_id": "6", "objectType": "secondaryTag"}]"
现在我尝试从 CSV 文件中的 JSON 数组创建节点和关系。 我可以使用此命令导入 CSV 文件:
LOAD CSV FROM file:///<my_file> AS row
此外,我可以通过以下查询获得 JSON 数组:
WITH apoc.convert.fromJsonList(row[3]) AS tags
现在我想为 CSV 文件中的每一行分别在 JSON 数组中的每个标签之间创建关系。
作为示例,让我们从 CSV 文件中获取第三行。我们在 JSON 数组中有 3 个对象,因此我想创建 3 个关系。 id为4&5、4&6、5&6的标签之间的关系
可悲的是,我完全被困在这里,不确定我是否必须使用 UNWIND 或 FOREACH.
编辑
我解决问题如下(所有相关节点已经导入数据库):
LOAD CSV FROM file:///<my_file> AS row
MATCH (q:Question {id: row[0]})--(t1:Tag)
WITH COLLECT(t1) AS tags, row[0] AS question_id
FOREACH (i IN range(0, size(tags) - 2) |
FOREACH (node1 IN [tags[i]] |
FOREACH (j IN range(i+1, size(tags) - 1) |
FOREACH (node2 IN [tags[j]] |
MERGE (node1)-[c:CONNECTED_TO]-(node2)
)
)
)
)
代码有效,但有 4 个 FOREACH 循环。我仍然相信有更漂亮的方法。所以请随时回答我的问题。
首先要意识到您还没有节点可以使用,您只有对象。您需要转换(MATCH、MERGE 或 CREATE)与这些关联的节点。
我们以最简单的情况为例,每次都创建新节点,并设置所有属性
LOAD CSV FROM file:///<my_file> AS row
WITH apoc.convert.fromJsonList(row[3]) AS tags
UNWIND tags as tag
CREATE (t:Tag)
SET t = tag // assigns map properties to node properties
WITH row, collect(t) as tagNodes
CALL apoc.nodes.link(tagNodes, 'REL')
RETURN count(*)
我正在使用来自 APOC Procedures 的 apoc.nodes.link()
轻松创建列表中所有节点之间的关系。但是如果你没有 APOC 或者不能使用它,你将不得不使用一些替代方法。
请参阅 creating and working with linked lists in Cypher
上的这篇知识库文章编辑
所以我错过了关于你想要在所有节点组合之间创建关系的部分,而不仅仅是通过它们的链表。
我们可以使用 apoc.coll.combinations()
获取列表中 2 个节点的每个组合,并在它们之间创建关系:
LOAD CSV FROM 'file:///<my_file>' as row
WITH row, apoc.convert.fromJsonList(row[3]) AS tags
UNWIND tags as tag
CREATE (t:Tag)
SET t = tag // assigns map properties to node properties
WITH row, collect(t) as tagNodes
UNWIND apoc.coll.combinations(tagNodes, 2) as pair
WITH pair[0] as start, pair[1] as end
CREATE (start)-[:REL]->(end)