【发布时间】:2014-08-17 17:01:02
【问题描述】:
我目前正在尝试合并三个数据集以进行分析。我正在使用某些常用字段来建立数据集之间的连接。为了创建连接,我尝试使用以下类型的查询:
MATCH (p1:Person),(p2:Person)
WHERE p1.email = p2.email AND p1.name = p2.name AND p1 <> p2
CREATE UNIQUE (p1)-[IS]-(p2);
类似的可以写成:
MATCH (p1:Person),(p2:Person {name:p1.name, email:p1.email})
WHERE p1 <> p2
CREATE UNIQUE (p1)-[IS]-(p2);
不用说,这是对大约 100,000 个 Person 节点的数据库的非常慢的查询,特别是考虑到 Neo4j 不会并行处理单个查询。
现在,我的问题是是否有更好的方法在 Neo4j 中运行此类查询。我至少有八个 CPU 内核专用于 Neo4j,只要单独的线程不会因锁定彼此所需的资源而占用。
问题是我不知道 Neo4j 如何构建其 Cypher 执行计划。例如,假设我运行以下测试查询:
MATCH (p1:Person),(p2:Person {name:p1.name, email:p1.email})
WHERE p1 <> p2
RETURN p1, p2
LIMIT 100;
尽管有 LIMIT 子句,Neo4j 仍然需要相当长的时间才能上交结果,这让我想知道即使对于这样一个有限的查询,Neo4j 在考虑 LIMIT 语句之前是否会生成整个笛卡尔积表。
感谢任何帮助,无论是解决这个特定问题还是让我了解 Neo4j 通常如何构建 Cypher 执行计划(以及如何优化查询)。旧的 Lucene 索引在这里有什么帮助吗?
【问题讨论】:
-
也许隐藏的无证特殊词
profile会给你更多关于性能的信息。它应该相当于 pSQLsexplain analyze。 stackoverflow.com/questions/17760627/…
标签: graph neo4j query-optimization cypher cartesian-product