如何在单个 csv 文件的不同列的已创建节点之间建立关系?
How to make relationships between already created nodes of different columns from a single csv file?
我有一个单个csv文件,其内容如下-
id,name,country,level
1,jon,USA,international
2,don,USA,national
3,ron,USA,local
4,bon,IND,national
5,kon,IND,national
6,jen,IND,local
7,ken,IND,international
8,ben,GB,local
9,den,GB,international
10,lin,GB,national
11,min,AU,national
12,win,AU,local
13,kin,AU,international
14,bin,AU,international
15,nin,CN,national
16,con,CN,local
17,eon,CN,international
18,fon,CN,international
19,pon,SZN,national
20,zon,SZN,international
首先我在 id
上创建了一个约束
CREATE CONSTRAINT idConstraint ON (n:Name) ASSERT n.id IS UNIQUE
然后我为 name
创建节点,然后为 country
创建节点,最后为 level
创建节点,如下 -
LOAD CSV WITH HEADERS FROM "file:///demo.csv" AS row
MERGE (name:Name {name: row.name, id: row.id, country:row.country, level:row.level})
MERGE (country:Country {name: row.country})
MERGE (level:Level {type: row.level})
我可以很好地看到节点。但是,我希望能够查询诸如某个给定国家/地区有多少个名字之类的信息?对于给定的级别,有多少个国家,然后该国家有多少个名字?
为此,我需要在节点之间建立关系。
为此我试过这样 -
LOAD CSV WITH HEADERS FROM "file:///demo.csv" AS row
MATCH (n:Name {name:row.name}), (c:Country {name:row.country})
CREATE (n)-[:LIVES_IN]->(c)
RETURN n,c
然而,这给了我如下警告 -
This query builds a cartesian product between disconnected patterns.
If a part of a query contains multiple disconnected patterns, this will build a cartesian product between all those parts. This may produce a large amount of data and slow down query processing. While occasionally intended, it may often be possible to reformulate the query that avoids the use of this cross product, perhaps by adding a relationship between the different parts or by using OPTIONAL MATCH (identifier is: (c))
此外,生成的图表看起来有点不对 - 每个名称节点与一个国家/地区有 2 个关系,而我认为只有一个?
我也一直担心自己没有以优化或正确的方式做事。这只是一个演示。在我的真实数据集中,我经常不能 运行 将多个 CREATE 或 MERGE 语句放在一起。我必须一次又一次地加载相同的 CSV 文件来完成从创建节点到几乎所有的事情。创建关系时,由于形成笛卡尔积,该命令基本上会给出 Java 堆内存错误。
PS。我昨天刚开始使用 neo4j。我真的不是很了解。纠结了一天,想来这里问一下。
您可以忽略笛卡尔积警告,因为需要这种精确的方法才能创建形成所需模式的关系。
至于多重关系,您可能 运行 查询了两次。第二个 运行 会创建重复关系。您可以对关系使用 MERGE 而不是 CREATE,这将确保不会有重复项。
我有一个单个csv文件,其内容如下-
id,name,country,level
1,jon,USA,international
2,don,USA,national
3,ron,USA,local
4,bon,IND,national
5,kon,IND,national
6,jen,IND,local
7,ken,IND,international
8,ben,GB,local
9,den,GB,international
10,lin,GB,national
11,min,AU,national
12,win,AU,local
13,kin,AU,international
14,bin,AU,international
15,nin,CN,national
16,con,CN,local
17,eon,CN,international
18,fon,CN,international
19,pon,SZN,national
20,zon,SZN,international
首先我在 id
CREATE CONSTRAINT idConstraint ON (n:Name) ASSERT n.id IS UNIQUE
然后我为 name
创建节点,然后为 country
创建节点,最后为 level
创建节点,如下 -
LOAD CSV WITH HEADERS FROM "file:///demo.csv" AS row
MERGE (name:Name {name: row.name, id: row.id, country:row.country, level:row.level})
MERGE (country:Country {name: row.country})
MERGE (level:Level {type: row.level})
我可以很好地看到节点。但是,我希望能够查询诸如某个给定国家/地区有多少个名字之类的信息?对于给定的级别,有多少个国家,然后该国家有多少个名字?
为此,我需要在节点之间建立关系。
为此我试过这样 -
LOAD CSV WITH HEADERS FROM "file:///demo.csv" AS row
MATCH (n:Name {name:row.name}), (c:Country {name:row.country})
CREATE (n)-[:LIVES_IN]->(c)
RETURN n,c
然而,这给了我如下警告 -
This query builds a cartesian product between disconnected patterns.
If a part of a query contains multiple disconnected patterns, this will build a cartesian product between all those parts. This may produce a large amount of data and slow down query processing. While occasionally intended, it may often be possible to reformulate the query that avoids the use of this cross product, perhaps by adding a relationship between the different parts or by using OPTIONAL MATCH (identifier is: (c))
此外,生成的图表看起来有点不对 - 每个名称节点与一个国家/地区有 2 个关系,而我认为只有一个?
我也一直担心自己没有以优化或正确的方式做事。这只是一个演示。在我的真实数据集中,我经常不能 运行 将多个 CREATE 或 MERGE 语句放在一起。我必须一次又一次地加载相同的 CSV 文件来完成从创建节点到几乎所有的事情。创建关系时,由于形成笛卡尔积,该命令基本上会给出 Java 堆内存错误。
PS。我昨天刚开始使用 neo4j。我真的不是很了解。纠结了一天,想来这里问一下。
您可以忽略笛卡尔积警告,因为需要这种精确的方法才能创建形成所需模式的关系。
至于多重关系,您可能 运行 查询了两次。第二个 运行 会创建重复关系。您可以对关系使用 MERGE 而不是 CREATE,这将确保不会有重复项。