我有一个CSV数据集,通过该数据集,我尝试在我的数据库中已存在的两种节点类型(Comment
和Person
)之间建立关系。
这是数据库信息 -
这是我尝试构建的当前关系comment_hasCreator_person
的csv文件 -
问题是 - 无论我尝试哪种Cypher查询,它们都会返回相同的内容 - "没有更改,没有行"。
以下是我尝试过的查询的不同变体 -
这是第一个查询 -
// 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标头最初名为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)
如果这不起作用,我跟着this answer并尝试使用MERGE
代替CREATE
,即使它不应该有所作为因为关系没有& #39; t首先存在 -
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文件导入关系时,为什么关系不会被创建,我完全不知道。我将不胜感激任何帮助。
答案 0 :(得分:3)
您的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
答案 1 :(得分:0)
您在此处缺少字段终止符,因为您的情况为|
,而不是;
。
你可以尝试一下:
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
答案 2 :(得分:0)
此类错误的另一个原因可能是CSV文件中的空格。如果CSV中的行如下所示:
2a9b40bc-78f0-4e79-9b2b-441108883448, Pink node - 2, 2, pink
然后,结果的索引1将是:'粉红色节点-2'(开始处有空格),而不是:'粉红色节点-2'。编辑csv文件或使用trim()函数将是此处的解决方案:
...
WHERE a.id = trim(line[0]) AND b.id = trim(line[1])
...