如何提取E、S、A三层一对多关系的多层关联结果?
实现E-S-A两层关联的Cypher查询方法
针对你的需求,要同时获取每个E节点关联的所有S节点,以及每个S节点对应的A节点,你可以通过嵌套聚合或者分层匹配的方式实现,以下是几种可行的Cypher写法:
1. 按E聚合,返回包含S及对应A集合的结果
这是最贴合需求的写法,每个E节点对应一个集合,集合里的每个元素是包含S节点和其关联A节点集合的对象:
MATCH (e:E)<--(s:S)-->(a:A) RETURN e, collect(DISTINCT {sNode: s, aNodes: collect(DISTINCT a)}) AS sWithAs
MATCH (e:E)<--(s:S)-->(a:A):一次性匹配E、关联的S以及S关联的A节点- 内层
collect(DISTINCT a):为每个S节点去重收集所有关联的A节点 - 外层
collect(DISTINCT ...):为每个E节点去重收集所有关联的S节点及其对应的A集合,避免同一S因关联多个E而重复出现
2. 按E和S分组,逐行展示对应关系
如果需要更直观地查看每个E下的单个S及其A节点集合,可以用这种写法:
MATCH (e:E)<--(s:S)-->(a:A) RETURN e, s, collect(DISTINCT a) AS aNodes ORDER BY e.id
结果会按E分组,每行对应一个E-S对,同时列出该S关联的所有A节点。
3. 包含无A关联的S节点
如果有些S节点没有关联任何A,你希望这些S也被包含在结果里,需要用OPTIONAL MATCH来匹配S和A的关系:
MATCH (e:E)<--(s:S) OPTIONAL MATCH (s)-->(a:A) RETURN e, collect(DISTINCT {sNode: s, aNodes: collect(DISTINCT a)}) AS sWithAs
此时无A关联的S对应的aNodes会是空集合。
内容的提问来源于stack exchange,提问作者drdot
相关产品推荐
相关产品推荐

