在现有节点之间创建关系的更快方法?
Posted
技术标签:
【中文标题】在现有节点之间创建关系的更快方法?【英文标题】:faster way to create relationship between existing nodes? 【发布时间】:2018-01-12 06:49:13 【问题描述】:我正在开发一个应用程序,其中我的 neo4j 数据库中只有“11263”个节点。 我正在使用以下密码查询来形成节点之间的关系:
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 数据库的新手,还有其他有效的方法吗?
【问题讨论】:
source.Id
和 target.Id
不应该有不同的值吗?
@cybersam 输入错误,我已相应地编辑了帖子。
【参考方案1】:
让你放慢速度的一大原因是你没有使用index 来查找你的起始节点。您与source
的匹配正在对您的数据库中的所有节点执行扫描,以在未展开列表中的每一行中查找可能的匹配项。然后它对target
做同样的事情。
您需要在节点上添加标签,如果它们已经有标签,请在查询中使用标签。您需要在标签和 id
属性上设置索引或唯一约束,以便将索引用于查找。
调整查询的最佳方法是在浏览器中试用它们,并使用 EXPLAIN 确保您正在使用索引查找,如果仍然很慢,请在查询上使用 PROFILE(它将执行查询)在查询执行时查看生成的行和数据库命中。
【讨论】:
感谢您的回复,我会做出建议的更改并更新结果。以上是关于在现有节点之间创建关系的更快方法?的主要内容,如果未能解决你的问题,请参考以下文章