【发布时间】: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