我正在尝试加快此查询:
LOAD CSV FROM 'file:///path/to/file' AS line
MATCH (n:Organization{rc:'2051061'})-[:Ap]->(a:Person{numDc: toint(line[1])})
CREATE (a)-[:Af]->(n)
CSV有大约100k行,关系(n:Organization)-[:Ap]->(a:Person)
在不同的a / b对之间是唯一的。标签:Organization
的节点数为50,:Person
的节点数为200k。
所以基本上我在csv中取一个值并检查a:与:Ap
的关系为:具有给定rc(2051061)的组织的人将该值设为numDc
然后我在Person和组织之间添加另一种关系。
我的查询运行速度太慢,我甚至将索引添加到:Person(numDc)
和Organization(rc)
。
所以我认为,因为我对每一行的组织都匹配可能是问题。
如果我确实知道它的话,我怎样才能获得与该节点的即时匹配? id>。
提前致谢。
答案 0 :(得分:2)
最好使用您自己的唯一标识符而不是节点ID。因为你不能依赖ID。节点ID基本上是节点在节点记录的文件中的地址。
您可以为csv文件添加唯一ID,并将其导入数据库。
或者您可以使用GraphAware UUID模块动态创建UUID - https://github.com/graphaware/neo4j-uuid
答案 1 :(得分:2)
注意:如果没有任何属性,您实际上可能不需要创建Af
关系,因为您可以轻松地遍历Ap
关系"向后"从a
到n
。
如果您确实需要创建Af
关系,可以通过强制Cypher使用这两个索引来提高性能。
在您的查询上使用PROFILE(使用2个索引),我看到Cypher计划程序(我尝试both planner types)使用SchemaIndex
运算符(利用索引)只有一个的索引。为了强制Cypher使用两个索引,您可以使用USING INDEX
子句,如下所示:
LOAD CSV FROM 'file:///path/to/file' AS line
MATCH (n:Organization { rc:'2051061' })
USING INDEX n:Organization(rc)
MATCH (n)-[:Ap]->(a:Person { numDc: toint(line[1])})
USING INDEX a:Person(numDc)
CREATE (a)-[:Af]->(n);
性能应该大大提高。