如何在Memgraph中执行多MATCH查询?查询返回0结果排查
Memgraph多MATCH查询支持及结果为0的问题分析
Memgraph完全支持多MATCH查询,你的问题出在Cypher查询的逻辑设计上,而非Memgraph的功能支持。
问题根源
你的查询中,第一个MATCH (e:Employee...), (o:Office...)是同时匹配两类节点,只有当数据库中同时存在符合status:'initiated'且id:'id-1'条件的Employee和Office节点时,这条MATCH才会返回结果行。如果其中任意一类节点不存在(或没有满足条件的实例),第一个MATCH会直接返回0行,后续的WITH和第二个MATCH都不会执行,最终导致整体查询返回0结果。
而你单独执行每个查询时,是分别查询单个节点类型,只要对应类型有符合条件的节点就能得到结果,但组合后需要两类节点同时存在才会生成查询行。
修复方案
如果你希望即使某类节点不存在,也能继续收集其他节点并完成查询,需要使用OPTIONAL MATCH替代MATCH——它允许匹配不存在的节点(未匹配时变量为null),再过滤掉空值得到有效节点列表:
OPTIONAL MATCH (e:Employee {status:'initiated', id:'id-1'}) OPTIONAL MATCH (o:Office {status:'initiated', id:'id-1'}) WITH [x IN [e, o] WHERE x IS NOT NULL] AS allEntities OPTIONAL MATCH (d:Gadget {status:'initiated', id:'id-1'}) OPTIONAL MATCH (a:Alarm {status:'initiated', id:'id-1'}) WITH allEntities, [x IN [d, a] WHERE x IS NOT NULL] AS allDevices RETURN size(allEntities), size(allDevices);
如果你的需求只是统计四类节点的总数量,也可以用UNION ALL合并各类型的查询结果:
MATCH (e:Employee {status:'initiated', id:'id-1'}) RETURN e AS node UNION ALL MATCH (o:Office {status:'initiated', id:'id-1'}) RETURN o AS node UNION ALL MATCH (d:Gadget {status:'initiated', id:'id-1'}) RETURN d AS node UNION ALL MATCH (a:Alarm {status:'initiated', id:'id-1'}) RETURN a AS node WITH COLLECT(node) AS allNodes RETURN size(allNodes) AS total_count;
内容的提问来源于stack exchange,提问作者Elwood Kharson
相关产品推荐
相关产品推荐

