在Cypher中Neo4J创建关系不返回任何更改,没有行

时间:2017-05-31 09:46:32

标签: csv neo4j cypher relationships

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

这是数据库信息 -

enter image description here

这是我尝试构建的当前关系comment_hasCreator_person的csv文件 -
enter image description here

问题是 - 无论我尝试哪种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.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)

如果这不起作用,我跟着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子句确保数据库中存在相应的CommentPerson节点,并且确实找到了所有的节点。

作为最后一步,我决定在CSV文件的第一行值之间手动创建关系 -

MATCH (c:Comment{id:1236950581249}), (p:Person{id:10995116284808})
CREATE (c)-[r:hasCreator]->(p)
RETURN c,r,p

这个工作得很好 -

enter image description here

当我从CSV文件导入关系时,为什么关系不会被创建,我完全不知道。我将不胜感激任何帮助。

3 个答案:

答案 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]) 
...