Neo4J 在 Cypher returns 中创建关系没有变化,没有行
Neo4J Create Relationships in Cypher returns no changes, no rows
我有一个 CSV 数据集,我试图通过它在我的数据库中已经存在的两种节点类型(Comment
和 Person
)之间建立关系。
这是数据库信息-
这是我正在尝试构建的当前关系 comment_hasCreator_person
的 csv 文件 -
问题是 - 无论我尝试哪种 Cypher 查询,它们都是 returns 相同的事情 - “没有变化,没有行”。
以下是我尝试过的查询的不同变体 -
这是第一个查询-
// comment_hasCreator_person_0_0.csv
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "https://dl.dropbox.com/s/qb4occggixmaz9g/comment_hasCreator_person_0_0.csv" AS line
MATCH (comment:Comment { id: toInt(line.Comment.id)}),(person:Person { id: toInt(line.Person.id)})
CREATE (comment)-[:hasCreator]->(person)
我认为这可能不起作用,因为我的 CSV headers 最初被命名为 Comment.id
和 Person.id
。所以我删除了 .
并尝试了查询,结果相同 -
// comment_hasCreator_person_0_0.csv
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "https://dl.dropbox.com/s/qb4occggixmaz9g/comment_hasCreator_person_0_0.csv" AS line
MATCH (comment:Comment { id: toInt(line.Commentid)}),(person:Person { id: toInt(line.Personid)})
CREATE (comment)-[:hasCreator]->(person)
当这不起作用时,我遵循 并尝试使用 MERGE
而不是 CREATE
,尽管它不应该有什么不同,因为关系没有首先存在-
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "https://www.dropbox.com/s/qb4occggixmaz9g/comment_hasCreator_person_0_0.csv?dl=0" AS line
MATCH (comment:Comment { id: toInt(line.Commentid)}),(person:Person { id: toInt(line.Personid)})
MERGE (comment)-[r:hasCreator]->(person)
RETURN comment,r, person
此查询刚刚返回“无行”。
我还尝试了一个不使用 toInt()
函数的查询变体,但这没有任何区别。
为了确保节点存在,我从 CSV 文件中选择随机单元格值并使用 MATCH
子句来确保相应的 Comment
和 Person
节点存在于数据库中,我确实找到了所有节点。
作为最后一步,我决定在 CSV 文件的第一行值之间手动创建关系 -
MATCH (c:Comment{id:1236950581249}), (p:Person{id:10995116284808})
CREATE (c)-[r:hasCreator]->(p)
RETURN c,r,p
这工作得很好 -
我完全不知道为什么当我从 CSV 文件导入关系时无法创建关系。如果有任何帮助,我将不胜感激。
您的 CSV 文件有问题。其中使用的字段终止符是“|”而不是默认的“,”。您可以编辑 CSV 文件并将字段终止符更改为“,”,或使用 LOAD CSV
.
中可用的选项 FIELDTERMINATOR
尝试将您的查询编辑成这样:
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "https://www.dropbox.com/s/qb4occggixmaz9g/comment_hasCreator_person_0_0.csv?dl=0" AS line
FIELDTERMINATOR '|'
MATCH (comment:Comment { id: toInt(line.Commentid)}),(person:Person { id: toInt(line.Personid)})
MERGE (comment)-[r:hasCreator]->(person)
RETURN comment,r, person
您在这里缺少字段终止符,因为在您的情况下它是 |
,而不是 ;
。
你可以试试这个:
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "filename" AS LINE FIELDTERMINATOR '|'
MERGE (comment:Comment { id: toInt(LINE.Commentid)})
MERGE (person:Person { id: toInt(line.Personid)})
MERGE (comment) - [r:has_creator] -> (person)
RETURN comment,r,person
这种错误的另一个原因可能是 CSV 文件中的白色 spaces。如果 CSV 中的行如下所示:
2a9b40bc-78f0-4e79-9b2b-441108883448, Pink node - 2, 2, pink
那么结果的索引 1 将是:“Pink node - 2”(注意开头的 space),而不是:'Pink node - 2'。编辑 csv 文件或使用 trim() 函数将是这里的解决方案:
...
WHERE a.id = trim(line[0]) AND b.id = trim(line[1])
...
我有一个 CSV 数据集,我试图通过它在我的数据库中已经存在的两种节点类型(Comment
和 Person
)之间建立关系。
这是数据库信息-
这是我正在尝试构建的当前关系 comment_hasCreator_person
的 csv 文件 -
问题是 - 无论我尝试哪种 Cypher 查询,它们都是 returns 相同的事情 - “没有变化,没有行”。
以下是我尝试过的查询的不同变体 -
这是第一个查询-
// comment_hasCreator_person_0_0.csv
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "https://dl.dropbox.com/s/qb4occggixmaz9g/comment_hasCreator_person_0_0.csv" AS line
MATCH (comment:Comment { id: toInt(line.Comment.id)}),(person:Person { id: toInt(line.Person.id)})
CREATE (comment)-[:hasCreator]->(person)
我认为这可能不起作用,因为我的 CSV headers 最初被命名为 Comment.id
和 Person.id
。所以我删除了 .
并尝试了查询,结果相同 -
// comment_hasCreator_person_0_0.csv
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "https://dl.dropbox.com/s/qb4occggixmaz9g/comment_hasCreator_person_0_0.csv" AS line
MATCH (comment:Comment { id: toInt(line.Commentid)}),(person:Person { id: toInt(line.Personid)})
CREATE (comment)-[:hasCreator]->(person)
当这不起作用时,我遵循 MERGE
而不是 CREATE
,尽管它不应该有什么不同,因为关系没有首先存在-
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "https://www.dropbox.com/s/qb4occggixmaz9g/comment_hasCreator_person_0_0.csv?dl=0" AS line
MATCH (comment:Comment { id: toInt(line.Commentid)}),(person:Person { id: toInt(line.Personid)})
MERGE (comment)-[r:hasCreator]->(person)
RETURN comment,r, person
此查询刚刚返回“无行”。
我还尝试了一个不使用 toInt()
函数的查询变体,但这没有任何区别。
为了确保节点存在,我从 CSV 文件中选择随机单元格值并使用 MATCH
子句来确保相应的 Comment
和 Person
节点存在于数据库中,我确实找到了所有节点。
作为最后一步,我决定在 CSV 文件的第一行值之间手动创建关系 -
MATCH (c:Comment{id:1236950581249}), (p:Person{id:10995116284808})
CREATE (c)-[r:hasCreator]->(p)
RETURN c,r,p
这工作得很好 -
我完全不知道为什么当我从 CSV 文件导入关系时无法创建关系。如果有任何帮助,我将不胜感激。
您的 CSV 文件有问题。其中使用的字段终止符是“|”而不是默认的“,”。您可以编辑 CSV 文件并将字段终止符更改为“,”,或使用 LOAD CSV
.
尝试将您的查询编辑成这样:
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "https://www.dropbox.com/s/qb4occggixmaz9g/comment_hasCreator_person_0_0.csv?dl=0" AS line
FIELDTERMINATOR '|'
MATCH (comment:Comment { id: toInt(line.Commentid)}),(person:Person { id: toInt(line.Personid)})
MERGE (comment)-[r:hasCreator]->(person)
RETURN comment,r, person
您在这里缺少字段终止符,因为在您的情况下它是 |
,而不是 ;
。
你可以试试这个:
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "filename" AS LINE FIELDTERMINATOR '|'
MERGE (comment:Comment { id: toInt(LINE.Commentid)})
MERGE (person:Person { id: toInt(line.Personid)})
MERGE (comment) - [r:has_creator] -> (person)
RETURN comment,r,person
这种错误的另一个原因可能是 CSV 文件中的白色 spaces。如果 CSV 中的行如下所示:
2a9b40bc-78f0-4e79-9b2b-441108883448, Pink node - 2, 2, pink
那么结果的索引 1 将是:“Pink node - 2”(注意开头的 space),而不是:'Pink node - 2'。编辑 csv 文件或使用 trim() 函数将是这里的解决方案:
...
WHERE a.id = trim(line[0]) AND b.id = trim(line[1])
...