Nebula Graph中如何在OPTIONAL MATCH结果中过滤指定root节点?
解决Nebula Graph中OPTIONAL MATCH后过滤节点的问题
你遇到的语法错误是因为Nebula Graph的Cypher语法不支持在OPTIONAL MATCH子句后直接添加WHERE条件,但你的过滤需求完全可以实现,不需要只能用GO语句和管道,以下是两种可行的Cypher风格解决方案:
方案1:保留所有符合条件的v,仅显示id匹配的root(无匹配时root为null)
如果需要保留所有关联user_0001的节点v,但仅当root的id等于root_id时才返回该root,否则root字段为null,可以在RETURN阶段通过CASE语句过滤:
MATCH (v)-[:has]->(:acl)<-[:ace_acl]-(:ace)-[:ace_principal|:member_of*1..2]-(v4) WHERE id(v4) == 'user_0001' OPTIONAL MATCH (v)-[:member_of]->(root:repository_group) RETURN DISTINCT v, CASE WHEN id(root) == 'root_id' THEN root ELSE NULL END AS root
方案2:仅返回存在匹配root的v
如果只需要保留那些确实存在id为root_id的root节点关联的v,可以将root的匹配条件整合到主MATCH中,同时添加WHERE过滤:
MATCH (v)-[:has]->(:acl)<-[:ace_acl]-(:ace)-[:ace_principal|:member_of*1..2]-(v4), (v)-[:member_of]->(root:repository_group) WHERE id(v4) == 'user_0001' AND id(root) == 'root_id' RETURN DISTINCT v, root
补充说明
Nebula Graph对OPTIONAL MATCH的语法限制是不允许在其后续直接跟WHERE子句,但可以通过RETURN阶段的条件处理,或者将匹配逻辑整合到主MATCH中的方式绕开限制,无需切换到GO语句和管道语法。
内容的提问来源于stack exchange,提问作者saber tabatabaee yazdi
相关产品推荐
相关产品推荐

