Neo4J中的单个匹配查询请求与多个匹配查询请求

时间:2015-08-19 15:51:32

标签: neo4j cypher

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

在我的情况下,使用单个匹配查询请求将使cypher最终得到许多WITH语句,并且cypher看起来很大,我担心密码可读性。

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

所以任何人都可以考虑一下这个问题?如果我应该在演出后,我应该采用单一查询请求方法吗?

仅供参考,我正在使用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;

2 个答案:

答案 0 :(得分:2)

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

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

在缺点方面,您必须重新查找手中已有的数据,并且还需要额外的网络和序列化工作。

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

答案 1 :(得分:1)

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

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

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