基于Neo4j Cypher多聚合查询筛选特定关联节点的技术问询
如何查询恰好认识2个Cust节点且仅在1家Comp节点工作的Cust节点
我来帮你搞定这个查询需求!要精准找出符合条件的Cust节点,我们可以通过统计关联节点数量+条件过滤的方式实现,同时还能优化原语句的效率问题:
步骤1:统计每个Cust节点的关联数据
原语句的写法会因为同时匹配Cust和Comp节点产生笛卡尔积,导致统计结果失真。我们可以分开统计每个Cust节点认识的其他Cust数量,以及工作的Comp数量,避免不必要的计算:
MATCH (from:Cust) // 统计认识的其他Cust节点(排除自己) OPTIONAL MATCH (from)-[]-(a:Cust) WHERE from <> a WITH from, COUNT(DISTINCT a) AS knows // 统计工作的Comp节点数量 OPTIONAL MATCH (from)-[]-(b:Comp) WITH from, knows, COUNT(DISTINCT b) AS works RETURN from.title, knows, works
这段语句会返回每个Cust节点的名称、认识的Cust数量、工作的Comp数量。
步骤2:添加过滤条件筛选目标节点
在统计结果的基础上,我们只需要加上WHERE子句,筛选出knows=2(恰好认识2个Cust)且works=1(仅在1家Comp工作)的节点即可:
MATCH (from:Cust) OPTIONAL MATCH (from)-[]-(a:Cust) WHERE from <> a WITH from, COUNT(DISTINCT a) AS knows OPTIONAL MATCH (from)-[]-(b:Comp) WITH from, knows, COUNT(DISTINCT b) AS works WHERE knows = 2 AND works = 1 RETURN from.title, knows, works
如果你想基于你最初的语句调整,需要注意修正笛卡尔积的问题,比如把匹配逻辑拆分,但上面的写法是更高效且准确的方案。
内容的提问来源于stack exchange,提问作者Srinath Ganesh
相关产品推荐
相关产品推荐

