在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;
答案 0 :(得分:2)
较小的匹配语句更容易规划和执行。 在重复使用(带参数)时,也更容易缓存已编译的计划。 您也可以同时运行它们。如果需要,您可以在同一个http请求中发送多个。
因此,您可以执行初始查询以检索更大的数据集,然后分页设置并发送较小的并发查询以读取每个块的更多内容(或为每个块写入数据)。
在缺点方面,您必须重新查找手中已有的数据,并且还需要额外的网络和序列化工作。
主要取决于您的用例和SLA(吞吐量和延迟)
答案 1 :(得分:1)
您始终可以使用换行符(例如,逗号后)和缩进来使长MATCH
语句可读。
另一方面,将长MATCH
语句分成多个语句并不一定会改变neo4j行为或性能(因为Cypher机制在优化方面做得很好)。当然,您可以使用PROFILE or EXPLAIN来比较查询的备用版本的行为。
但有一个很大的警告。单个MATCH
语句(涉及关系)将自动过滤掉重复的关系;这通常是你想要的。如果将其分解为多个MATCH
语句,使得并非所有关系在同一语句中匹配,那么您将失去该过滤。有关详细信息,请参阅this question。