我正在开发一个应用程序,其中我的neo4j数据库中只有“11263”个节点。 我正在使用以下cypher查询来形成节点之间的关系:
let CreateRelations(fromToList : FromToCount list)=
client.Cypher
.Unwind(fromToList, "fromToList")
.Match("(source)", "(target)")
.Where("source.Id= fromToList.SId and target.Id= fromToList.FId ")
.Merge("(source)-[relation:Fights_With]->(target)")
.OnCreate()
.Set("relation.Count= fromToList.Count,relation.Date= fromToList.Date")
.OnMatch()
.Set("relation.Count= (relation.Count+ fromToList.Count )")
.Set("relation.Date= fromToList.Date")
.ExecuteWithoutResults()
在neo4j数据库中形成1000个关系需要大约47到50秒。 我是neo4j DB的新手,还有其他有效的方法吗?
答案 0 :(得分:2)
让您失望的最重要的事情是您没有使用index来查找起始节点。您与source
的匹配正在执行数据库中所有节点的扫描,以查找可能的匹配项,在您展开的列表中每行。然后它与target
做同样的事情。
您需要在节点上添加标签,如果它们已经有标签,请使用查询中的标签。您在标签和id
属性上需要索引或唯一约束,因此索引将用于查找。
调整查询的最佳方法是在浏览器中试用它们,并使用EXPLAIN确保您使用索引查找,如果它仍然很慢,请在查询中使用PROFILE(它将执行查询)以查看生成的行和db命中执行时的命中。