【问题标题】:why cypher queries or may be neo4j gives low perfomance?为什么 cypher 查询或可能是 neo4j 会导致性能低下?
【发布时间】:2013-11-26 13:13:49
【问题描述】:

我正在使用 Neo4j 2.0-M5 社区版的 Neo4j。

我使用来自here 的 JDBC 驱动程序创建了节点,不幸的是我没有处理自动索引,而是创建了标签。我有 5000 万个节点、1.6 亿个属性和 10 个关系。我使用 Java Neo4j 嵌入式 API 执行此查询

MATCH(names:DAR)
with names limit 200000
where names.name <> null
and (names.name =~ ".* (?i)SHAIK$" or names.name =~ "(?i)SHAIK .*$"
or names.name =~ ".* (?i)SHAIK .*$" or names.name =~ "(?i)SHAIK" )
AND NOT(names.name =~ '.(?i)shekar.$')
AND NOT(names.name =~ '.(?i)shekhar.$')
AND NOT(names.name =~ '.(?i)sheker.$')
return names as names1 

在密码控制台中需要 40 秒,在 Java Neo4j 嵌入式 API 中需要 2 分钟
好的,好的,稍后我使用以下代码处理这些

Iterator<Node> resultNode1 = result.columnAs("names1");  
while (resultNode1.hasNext()) {
     System.out.println("after ddd"+Calendar.getInstance().getTime());
}

第一个记录需要几秒钟,但最后一个记录需要 5 分钟

我尝试了不同的输入,例如 SHAeK 和 sheek。如果迭代器中有 100 条记录,则前 99 条记录需要几秒钟,第 100 条记录需要 5 分钟。

我无法提高性能,请帮帮我?

【问题讨论】:

  • 明确一点:5 千万 = 5000 万?那么您有 5000 万个节点,并且一次针对 200,000 个节点执行多达 7 次正则表达式检查?只是一个猜测,因为我还没有尝试过,但我认为这需要大量的 CPU...
  • 这个有什么替代方案吗?
  • 但我们只在 200000 个节点上应用,
  • 如果不是遗留索引,您是否使用标签索引?如果你运行CREATE INDEX ON :DAR(name),给索引填充时间,然后运行你的查询会发生什么,有什么区别吗?
  • 抱歉,在运行应用程序之前执行了 CREATE INDEX ON :DAR(name)

标签: java performance neo4j cypher


【解决方案1】:

我在这里看到的问题是,您的驱动程序生成的 Cypher 查询严重依赖于 RegEx 而不是 Lucene。

在您匹配的 200,000 条记录中运行一个复杂的正则表达式(如您提供的正则表达式)的计算成本很高。我建议您首先限制要匹配的记录数量,然后执行正则表达式匹配。在合理的执行时间内,可管理的记录数量将低于 100。

如果这对您的应用程序不可行,那么我会考虑一种索引策略,允许您使用 Lucene 查询来执行匹配,而不是使用标签 + RegEx。

干杯,

肯尼

【讨论】:

  • 感谢您的重播,但 jdbc 导入器不支持自动索引
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多