如何编写单条Cypher语句实现文件夹节点的优先级包含查询
解决方案
可以通过结合OPTIONAL MATCH和CASE语句实现需求,以下是具体的Cypher语句:
MATCH (f:FOLDER) OPTIONAL MATCH (f)-[:CONTAINS]->(a:TYPE_A) OPTIONAL MATCH (f)-[:CONTAINS]->(b:TYPE_B) RETURN CASE WHEN count(a) > 0 THEN collect(id(a)) WHEN count(b) > 0 THEN collect(id(b)) ELSE [] END AS folder_contained_ids
语句说明:
MATCH (f:FOLDER):匹配目标文件夹节点,若需针对特定文件夹,可添加WHERE条件(例如WHERE id(f) = 你的文件夹ID)OPTIONAL MATCH:分别尝试匹配文件夹关联的TYPE_A和TYPE_B节点,无匹配时对应变量为nullCASE逻辑:- 优先检查是否存在
TYPE_A节点,若存在则收集所有TYPE_A节点的ID组成数组返回 - 若没有
TYPE_A节点,再检查TYPE_B节点,存在则收集其ID数组返回 - 两种节点都不存在时,返回空数组
[]
- 优先检查是否存在
如果你的场景中每个文件夹只会关联单个目标节点,也可以简化为:
MATCH (f:FOLDER) OPTIONAL MATCH (f)-[:CONTAINS]->(a:TYPE_A) OPTIONAL MATCH (f)-[:CONTAINS]->(b:TYPE_B) RETURN COALESCE(id(a), id(b), []) AS folder_contained_id
内容的提问来源于stack exchange,提问作者Arjun
相关产品推荐
相关产品推荐

