为了创建节点,我编写了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之间的关系。但是,我想创建一个查询来创建所有这些查询,以使其效率更高。这可行吗,我该怎么做?我找不到办法。
答案 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)