如何获得与节点的即时匹配,如果我知道它是< id>

时间:2015-11-06 19:55:12

标签: neo4j cypher

我正在尝试加快此查询:

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>。

提前致谢。

2 个答案:

答案 0 :(得分:2)

最好使用您自己的唯一标识符而不是节点ID。因为你不能依赖ID。节点ID基本上是节点在节点记录的文件中的地址。

您可以为csv文件添加唯一ID,并将其导入数据库。

或者您可以使用GraphAware UUID模块动态创建UUID - https://github.com/graphaware/neo4j-uuid

答案 1 :(得分:2)

注意:如果没有任何属性,您实际上可能不需要创建Af关系,因为您可以轻松地遍历Ap关系"向后"从an

如果您确实需要创建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);

性能应该大大提高。