Neo4J 在 Cypher returns 中创建关系没有变化,没有行

Neo4J Create Relationships in Cypher returns no changes, no rows

我有一个 CSV 数据集,我试图通过它在我的数据库中已经存在的两种节点类型(CommentPerson)之间建立关系。

这是数据库信息-

这是我正在尝试构建的当前关系 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.idPerson.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 子句来确保相应的 CommentPerson 节点存在于数据库中,我确实找到了所有节点。

作为最后一步,我决定在 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]) 
...