从CSV加载时如何创建节点,创建关系并删除属性?

时间:2019-12-15 14:46:08

标签: neo4j

为了创建节点,我编写了3个查询:对节点的属性以及与节点:Users和:Posts的关系进行注释:

USING PERIODIC COMMIT 10000
LOAD CSV WITH HEADERS FROM "http://neuromancer.inf.um.es:8080/es.stackoverflow/Comments.csv" AS row
    CREATE(n)
    SET n=row
    WITH n AS node
        CREATE (c:Comment {Id: node.Id, CreationDate: node.CreationDate,
                           Score: node.Score, Text: node.Text,
                           UserId: node.UserId, PostId: node.PostId});

MATCH (c:Comment), (u:User)
WHERE toInt(c.UserId) = toInt(u.Id)
    CREATE (u)-[:AUTHOR_OF]->(c)
    REMOVE c.UserId;

MATCH (c:Comment), (p:Post)
WHERE toInt(c.PostId) = toInt(p.Id)
    CREATE (c)-[:INCLUDED_IN]->(p)
    REMOVE c.PostId;

第一个查询创建节点,第二个和第三个查询创建:Comment和:User和:Comment和:Post之间的关系。但是,我想创建一个查询来创建所有这些查询,以使其效率更高。这可行吗,我该怎么做?我找不到办法。

1 个答案:

答案 0 :(得分:1)

首先,不需要创建临时节点n或临时id属性。 其次,根据文件的大小,对文件进行两次传递可能更有效,一次传递来创建注释,第二次传递来匹配节点并创建关系。最好尝试/配置并查看。

只有一遍,这就是它的样子:

USING PERIODIC COMMIT 10000
LOAD CSV WITH HEADERS FROM "http://neuromancer.inf.um.es:8080/es.stackoverflow/Comments.csv" AS row
CREATE (c:Comment {Id: row.Id, CreationDate: row.CreationDate,Score: row.Score, Text: row.Text})
WITH c
MATCH (u:User) WHERE u.Id = toInt(row.UserId)
CREATE (u)-[:AUTHOR_OF]->(c)
WITH c
MATCH (p:Post) WHERE p.Id=toInt(c.PostId)
CREATE (c)-[:INCLUDED_IN]->(p)

两次通过

USING PERIODIC COMMIT 10000
LOAD CSV WITH HEADERS FROM "http://neuromancer.inf.um.es:8080/es.stackoverflow/Comments.csv" AS row
CREATE (c:Comment {Id: row.Id, CreationDate: row.CreationDate,Score: row.Score, Text: row.Text})
USING PERIODIC COMMIT 10000
LOAD CSV WITH HEADERS FROM "http://neuromancer.inf.um.es:8080/es.stackoverflow/Comments.csv" AS row
MATCH (c:Comment {Id: row.Id})
MATCH (u:User) WHERE u.Id = toInt(row.UserId)
MATCH (p:Post) WHERE p.Id=toInt(c.PostId)
CREATE (u)-[:AUTHOR_OF]->(c)
CREATE (c)-[:INCLUDED_IN]->(p)