neo4j 密码查询优化

Posted

技术标签:

【中文标题】neo4j 密码查询优化【英文标题】:neo4j cypher query optimization 【发布时间】:2013-07-21 08:17:21 【问题描述】:

对于 500,000 个节点,我需要 10-15 秒,知道如何优化吗?

start n=node(*) WHERE HAS(n.score) RETURN n, n.score ORDER BY n.score DESC 限制 5;

环顾四周,我感觉到 WHERE 子句正在减慢速度,但我不确定如何在节点的属性上使用 MATCH。

【问题讨论】:

【参考方案1】:

正如 Luanne 所说,这需要时间,因为您正在搜索图表的所有节点。 您只能在具有 score 属性的节点中搜索(通过索引它们,通过从公共节点搜索它们,或者 - 如果您使用的是 Neo4j 2 - 通过标记它们)

有关索引的进一步说明(这似乎是更常见的解决方案),请参阅 http://docs.neo4j.org/chunked/milestone/indexing.html

【讨论】:

我几乎要索引所有节点,因为很多节点都有 score 属性,所以我不确定索引是否会使其更快。 即使有很多节点,索引也会让它更快。问题是索引使数据库变得更大。无论如何,无论您使用哪种数据库(我的意思是图形与否),您拥有的实体越多,找到一个所需的时间就越多。尝试将其编入索引并向我们提供反馈,但我认为您所暴露的问题与 Neo4j 无关。【参考方案2】:

使用 node(*),您可以有效地触摸 500,000 个节点的整个图表,以检查属性的存在,并对结果进行排序。你得到多少行? 如果你放弃你的订单条款,它会更快吗?

您的用例是什么?想知道您是否可以对此进行不同的建模以避免全局图形操作。例如,使用 score 属性索引节点,或者创建从所有具有 score 属性的节点到某种参考节点的关系。真的取决于你的用例

【讨论】:

大部分节点都有分值。这里的用例是找到得分最高的 X 个节点,这就是我使用该顺序的原因。也许当我在每个节点上设置 score 属性时,我应该与当前的高分集进行比较,并与索引的高分节点建立高分关系,但确实有点限制自己。 嗯,如果您的大多数节点都有分值,那么这将是一项昂贵的操作,尤其是随着您的图表的增长。如果它成为限制因素,可能不得不考虑其他一些方法来处理图表之外的问题

以上是关于neo4j 密码查询优化的主要内容,如果未能解决你的问题,请参考以下文章

Neo4j - 复杂的密码查询 - 需要外连接

Neo4j 图中的密码查询

Neo4J 密码查询“继承”术语

Neo4j 密码查询以获取与特定其他节点没有关系的所有节点

在 neo4j 密码查询中使用多个匹配子句不会返回任何结果

如何在 neo4j .net 客户端中使用密码查询返回两个集合