Cypher多WHERE/WHERE NOT语句关联问题:跨教派婚姻查询
18世纪荷兰共和国跨教会通婚Cypher查询方案
需求说明
查询18世纪荷兰共和国中,乌得勒支教会受洗人群与罗马天主教会受洗人群的通婚记录,但需排除以下两种情况:
- 乌得勒支教会受洗者在婚前参与过罗马天主教会的活动
- 罗马天主教会受洗者在婚前参与过乌得勒支教会的活动
完整Cypher查询语句
MATCH (p:person)-[:MARRIED_AT]-(m:marriage)-[:MARRIED_AT]-(pp:person) // 筛选基础条件:两人分别在目标教会受洗,且婚姻发生在18世纪 WHERE (p)-[:BAPTISED_AT]-(:event:baptism)--(:church:Church_of_Utrecht) AND (pp)-[:BAPTISED_AT]-(:event:baptism)--(:church:Roman_Catholic_Church) AND m.Event_year BETWEEN 1701 AND 1800 // 排除p婚前参与罗马天主教会活动的情况 AND NOT EXISTS { MATCH (p)--(e:event)--(:church:Roman_Catholic_Church) WHERE e.Event_year < m.Event_year } // 排除pp婚前参与乌得勒支教会活动的情况 AND NOT EXISTS { MATCH (pp)--(ee:event)--(:church:Church_of_Utrecht) WHERE ee.Event_year < m.Event_year } // 按需返回结果字段 RETURN p.name AS utrecht_baptised_name, pp.name AS roman_catholic_baptised_name, m.Event_year AS marriage_year, m.location AS marriage_location
关键逻辑解释
- 婚姻关系匹配:通过
[:MARRIED_AT]关联夫妻节点与婚姻节点,确保获取完整的婚姻上下文。 - 时间范围锁定:用
BETWEEN直接限定婚姻发生在1701-1800年(18世纪),精准缩小查询范围。 - 对立教会活动排除:使用
NOT EXISTS子查询分别验证两人是否在婚前参与过对立教会活动,这种写法避免了笛卡尔积问题,且逻辑更清晰易读。 - 结果定制:返回字段可根据分析需求调整,比如增加教会名称、事件详情等。
内容的提问来源于stack exchange,提问作者Jaap
相关产品推荐
相关产品推荐

