Cypher 查询优化

问题描述 投票:0回答:1

密码可以查询吗

MATCH p=(n: customer) - [r*1. {max_hops}] -> (m: customer) In › return nodes (p) as nodes, relationships(p) as relationships, length(p) as hops

进行内存优化但产生相同的结果?

我正在尝试使用此查询在 Neo4j 图中找到 3 跳关系,它适用于小图,但对于较大的图,它会给出内存错误

neo4j cypher
1个回答
0
投票

要优化 Cypher 查询以获取 Neo4j 图中特定跳数的关系,同时避免内存错误,请考虑以下改进策略:

优化密码查询

如果可能,请指定准确的跳数,而不是使用可能导致路径组合爆炸的可变长度路径。例如,如果您正在寻找正好 3 跳的关系,您可以使用:

MATCH p=(n:customer)-[r*3]->(m:customer)
RETURN nodes(p) AS nodes, relationships(p) AS relationships, length(p) AS hops

此查询直接针对长度为 3 的路径,通过限制探索的路径来减少内存占用。

使用
WITH
控制中间结果

如果您需要允许跳数的灵活性,但仍希望有效管理内存使用情况,请使用

WITH
将查询分成几部分:

MATCH (n:customer)
WITH n
MATCH p=(n)-[r*1..3]->(m:customer)
RETURN nodes(p) AS nodes, relationships(p) AS relationships, length(p) AS hops

该结构首先处理初始节点集,允许引擎在扩展路径搜索之前优化内存使用。

早期过滤

如果您可以根据节点属性应用任何过滤器,请尽早执行此操作,以最大程度地减少处理的节点数量:

MATCH (n:customer)
WHERE n.property = 'value'  // Add your filtering criteria here
WITH n
MATCH p=(n)-[r*1..3]->(m:customer)
RETURN nodes(p) AS nodes, relationships(p) AS relationships, length(p) AS hops

PROFILE

进行分析

使用

PROFILE
命令深入了解查询性能:

PROFILE MATCH (n:customer)-[r*1..3]->(m:customer)
RETURN nodes(p) AS nodes, relationships(p) AS relationships, length(p) AS hops

这将显示每个步骤处理了多少行,并可以突出显示潜在的低效率。

限制输出

如果您期望得到较大的结果集,请考虑限制结果:

MATCH p=(n:customer)-[r*1..3]->(m:customer)
WITH nodes(p) AS nodes, relationships(p) AS relationships, length(p) AS hops
RETURN collect(nodes) AS nodesList, collect(relationships) AS relationshipsList, count(hops) AS totalHops
LIMIT 1000  // Adjust as needed

考虑建立索引

确保您的

customer
节点上有适当的索引。索引可以通过减少过滤节点所需的时间来显着提高性能。

总结

  1. 尽可能直接指定跳数
  2. 使用
    WITH
    管理中间结果和内存使用情况。
  3. 根据属性尽早过滤
  4. 使用
  5. PROFILE
    分析
    查询计划。
  6. 限制输出以避免出现过大的结果集。
  7. 适当索引以增强查询性能。

实施这些策略应该可以帮助您在更大的图表上高效地运行查询,而不会遇到内存错误。如果您对数据或限制有更多细节,请随时分享以获取更多量身定制的建议!

© www.soinside.com 2019 - 2024. All rights reserved.