【问题标题】:Single match query request vs Multiple match query request in Neo4JNeo4J 中的单匹配查询请求与多匹配查询请求
【发布时间】:2015-08-19 15:51:32
【问题描述】:

在 Neo4j 中执行单个匹配查询请求与执行多个匹配查询请求哪个更好? (注意:这里只读取(MATCH/OPTIONAL MATCH)密码,不关心写操作密码)。

在我的情况下,使用单个匹配查询请求会使密码以许多 WITH 语句结束,并且密码看起来很大,我担心密码的可读性。

另一方面,通过使用多个匹配查询请求,我担心性能,因为会有多个数据库命中。

所以任何人都可以给我一个想法?如果我应该在性能之后,我应该使用单一查询请求方法吗?

仅供参考,我使用的是 Neo4j v2.2。

更新:

单个匹配查询的示例:

MATCH (a:A {id: {id} }), (b:B {id: {id2} })

WITH a, b

MATCH (b)-[:R1]->(x:X)
OPTIONAL MATCH (y:Y)-[:R2]->(x)

WITH a, b, COUNT(y) as c

OPTIONAL MATCH (a)-[r3:R3]->(b)

WITH a, b, c, COUNT(r3) > 0 AS d;

... // another MATCH/OPTIONAL MATCH & WITH statements

RETURN a, b, c, d, ...;

如果使用多个查询请求:

// Query 1
MATCH (a:A {id: {id} }), (b:B {id: {id2} })
RETURN a, b;

// Query 2
MATCH (b:B {id: {id}})-[:R1]->(x:X)
OPTIONAL MATCH (y:Y)-[:R2]->(x)
RETURN COUNT(y);

// Query 3
MATCH (a:A {id: {id}})-[r3:R3]->(b:B {id: {id2}})
RETURN COUNT(r3) > 0;

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    较小的匹配语句更容易计划和执行。 也更容易缓存编译的计划,因为它们被重复使用(带参数)。 您也可以同时运行它们。如果需要,您可以在同一个 http 请求中发送多个。

    因此,您可以执行初始查询以检索更大的数据集,然后分页设置并发送较小的并发查询以读取每个块的更多内容(或为每个块写入数据)。

    不利的一面是,您必须重新查找手头已有的数据,并且需要额外的网络和序列化工作。

    这主要取决于您的用例和 SLA(吞吐量和延迟)

    【讨论】:

    • 单个查询请求(假设也使用参数),只需要一次数据库命中就可以得到结果,所以从逻辑上讲它会比并发执行多个查询请求更快吗?
    【解决方案2】:

    您始终可以使用换行符(例如,在逗号之后)和缩进使长 MATCH 语句可读。

    另一方面,将较长的 MATCH 语句拆分为多个语句并不一定会改变 neo4j 的行为或您的性能(因为 Cypher 机制在优化方面做得很好)。可以肯定的是,您可以使用 PROFILE or EXPLAIN 来比较查询的替代版本的行为。

    但是有一个很大的警告。单个MATCH 语句(涉及关系)将自动过滤掉重复的关系;这通常是你想要的。如果您将其分解为多个 MATCH 语句,使得并非所有关系都在同一语句中匹配,那么您将失去该过滤。请参阅this question 了解更多信息。

    【讨论】:

      猜你喜欢
      • 2022-01-12
      • 2022-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多