出于测试目的,我将来自另一个数据源的数据导入neo4j。 我仅将数据导入为节点。现在我想根据导入的ID添加边缘。每个节点都有2个字段
为了提高性能,我还创建了一个属性“id”的索引和属性“from”的索引
首先我创建了两个属性String(从列表中以逗号分隔的String)。
这有效,但速度很慢:
MATCH (e:Test1),(r:Test2)
WHERE r.from CONTAINS e._id
MERGE (e)-[:HAS]->(r)
有更好的方法吗?
PS:我还尝试将from字段存储为String []。比我使用以下查询
MATCH (e:Test1),(r:Test2)
WHERE e._id IN r.from
MERGE (e)-[:HAS]->(r)
- >表现相同
答案 0 :(得分:1)
问题在于您采用了所有组件的组合 - 笛卡尔积。在这两种情况下。 split the string by comma对标识符的处理会更好。例如:
MATCH (T2:Test2)
UNWIND split(T2.from, ",") as id
MATCH (T1:Test1) WHERE T1._id = id
MERGE (T1)-[:HAS]->(T2)
或者,如果您将标识符保留在数组中:
MATCH (T2:Test2)
UNWIND T2.from as id
MATCH (T1:Test1) WHERE T1._id = id
MERGE (T1)-[:HAS]->(T2)
当然,不要忘记索引。
答案 1 :(得分:1)
实际上,在导入时,您应该创建:HAS
关系,而不是创建from
属性(这会强制您进行浪费的额外查询以创建关系,并使您保持冗余您可能想要删除的from
属性。
例如,如果您使用LOAD CSV
导入,并且导入文件包含test2Id
和from
列(分别是字符串和字符串集合),则此导入查询应该创建所有节点和关系:
LOAD CSV WITH HEADERS FROM "file:///input.csv" AS row
MERGE (t2:Test2 {id: row.test2Id})
WITH row, t2
UNWIND row.from AS t1Id
MERGE (t1:Test1 {id: t1Id})
MERGE (t1)-[:HAS]->(t2);
为了获得更好的性能,您需要:Test1(id)
和:Test2(id)
上的索引。