database - CYPHER 2.3 在 Neo4j 查询中的性能

标签 database performance graph neo4j cypher

我在 Neo4j 查询中遇到问题。假设我有一个名为 App 的节点类型。 App 节点有字段“m_id”和“info”。我想构建一个查询以在字段“信息”相等的节点之间创建关系。

这是查询:

MATCH (a:App {m_id:'SOME_VALUE' }),(b:App {info: a.info}) WHERE ID(a)<>ID(b) AND NOT (b)-[:INFO]->(a) MERGE (a)-[r:INFO]->(b) RETURN b.m_id;

我也有两个字段的索引:

CREATE CONSTRAINT ON (a:App) ASSERT a.m_id IS UNIQUE;
CREATE INDEX ON :App(info);

但问题是我的查询非常慢,可以访问 App 节点的所有记录。

这是查询的配置文件:

+---------------+--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+
| Operator      | Rows   | DB Hits | Identifiers     | Other                                                                                                                          |
+---------------+--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+
| +ColumnFilter |      0 |       0 | b.m_id          | keep columns b.m_id                                                                                                            |
| |             +--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+
| +Extract      |      0 |       0 | a, b, b.m_id, r | b.m_id                                                                                                                         |
| |             +--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+
| +Merge(Into)  |      0 |       1 | a, b, r         | (a)-[r:INFO]->(b)                                                                                                             |
| |             +--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+
| +Eager        |      0 |       0 | a, b            |                                                                                                                                |
| |             +--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+
| +Filter       |      0 |  2000000 | a, b            | Ands(b.info == a.info, NOT(IdFunction(a) == IdFunction(b)), NOT(nonEmpty(PathExpression((b)-[anon[104]:INFO]->(a), true)))) |
| |             +--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+
| +SchemaIndex  | 184492 |  1000000 | a, b            | {  AUTOSTRING0}; :App(m_id)                                                                                                    |
| |             +--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+
| +NodeByLabel  | 184492 |  1000001 | b               | :App                                                                                                                           |
+---------------+--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+

最佳答案

尝试查找 a单独使用 WITH子句 a.info到一个由单独的 MATCH 使用的临时变量中b 的条款,如:

MATCH (a:App { m_id:'SOME_VALUE' })
WITH a, a.info AS a_info
MATCH (b:App { info: a_info })
WHERE a <> b AND NOT (b)-[:INFO]->(a)
MERGE (a)-[r:INFO]->(b)
RETURN b.m_id;

在比较 2 个节点的属性时,似乎倾向于不使用索引。 a_info的使用消除了这种障碍。

如果上面的配置文件显示一个或两个索引没有被使用,您可以尝试添加索引提示:

MATCH (a:App { m_id:'SOME_VALUE' })
USING INDEX a:App(m_id)
WITH a, a.info AS a_info
MATCH (b:App { info: a_info })
USING INDEX b:App(info)
WHERE a <> b AND NOT (b)-[:INFO]->(a)
MERGE (a)-[r:INFO]->(b)
RETURN b.m_id;

关于database - CYPHER 2.3 在 Neo4j 查询中的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36341152/

相关文章:

java - 在图和子图上表示和执行 IO

android - 创建安卓数据库表

java - 建立与mysql数据库的连接(关于优化的问题)

javascript - GraphQL/graphcool - 关系的变异

jquery - 图像密集型站点性能问题

c# - 自定义 Linq 扩展的性能差异/改进

javascript - jqplot x轴间距

python - 在 Python 中绘制 Pandas 数据集的树形图

php - 数据库设计/结构——随时间收集数据

database - 数据库系统中用户定义的完整性规则的示例?