如何修改Neo4j Cypher查询,过滤匹配结果中入度>1的r节点?
Question
我当前执行的Neo4j Cypher查询为:
MATCH (n:ARTICLE { article_id: '1234' })-[k:CONNECTS]->(r:ARTICLE) RETURN n,k,r;
现需对查询结果进行过滤,筛选出其中入度(即指向r的CONNECTS关系的度数)大于1的r节点,请问应如何操作?(我认为此问题与“如何在Neo4j中使用MATCH过滤时获取节点度数”存在差异,因此决定单独提问。)
Answer
刚好最近也处理过类似的需求,给你两种实用的解决方案:
方案一:直接计算入度并过滤
这种方式最直观,在原查询的基础上,用SIZE()函数计算r节点的入度,再通过WHERE子句筛选符合条件的记录:
MATCH (n:ARTICLE { article_id: '1234' })-[k:CONNECTS]->(r:ARTICLE) // 计算r节点的入度:所有指向r的CONNECTS关系数量 WITH n, k, r, SIZE((:ARTICLE)-[:CONNECTS]->r) AS in_degree WHERE in_degree > 1 RETURN n, k, r
这里的SIZE((:ARTICLE)-[:CONNECTS]->r)会统计所有类型为ARTICLE的节点通过CONNECTS关系指向r的数量,也就是r的入度,之后只保留入度大于1的结果即可。
方案二:先筛选高入度节点再关联路径
如果你的数据库中ARTICLE节点数量很大,而入度大于1的节点占比很小,这种方式可能性能更优:
// 第一步:先找出所有入度大于1的ARTICLE节点 MATCH ()-[:CONNECTS]->(r:ARTICLE) WITH r, COUNT(*) AS in_degree WHERE in_degree > 1 // 第二步:再匹配这些节点和目标节点n的连接关系 MATCH (n:ARTICLE { article_id: '1234' })-[k:CONNECTS]->(r) RETURN n, k, r
这种方式先缩小范围,只保留符合入度要求的r节点,再去匹配和n的关联路径,避免对大量不符合条件的节点进行计算。
你可以根据自己的数据规模和查询性能需求选择合适的方案。
内容的提问来源于stack exchange,提问作者Simon Brunner
相关产品推荐
相关产品推荐

