性能:根据属性ID在neo4j中创建关系

时间:2017-01-25 15:46:56

标签: neo4j cypher

出于测试目的,我将来自另一个数据源的数据导入neo4j。 我仅将数据导入为节点。现在我想根据导入的ID添加边缘。每个节点都有2个字段

  • id:包含标识符String
  • from:包含所有连接为String []

为了提高性能,我还创建了一个属性“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)

- >表现相同

2 个答案:

答案 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导入,并且导入文件包含test2Idfrom列(分别是字符串和字符串集合),则此导入查询应该创建所有节点和关系:

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)上的索引。