Neo4j如何按路径长度分组对apoc返回路径各随机采样1条
Neo4j 按路径长度分组随机抽样路径实现方案
你可以通过Cypher的分组聚合+随机下标取值的逻辑,实现「每个路径长度分组随机返回1条样本路径」的需求,完整查询语句如下:
// 先匹配你的起点A和终点B,替换为实际的标签、属性筛选条件 MATCH (A:Node {id: "A的id值"}), (B:Node {id: "B的id值"}) // 调用APOC过程获取所有最长3跳的简单路径 CALL apoc.algo.allSimplePaths(A, B, '', 3) YIELD path // 按路径实际跳数分组,收集同长度的所有路径 WITH length(path) AS pathHop, collect(path) AS sameHopPaths // 生成随机数组下标,从每个分组中抽取1条路径 WITH pathHop, sameHopPaths[toInteger(rand() * size(sameHopPaths))] AS randomSamplePath // 按跳数升序返回结果 RETURN pathHop, randomSamplePath ORDER BY pathHop ASC
逻辑说明
length(path)计算的是路径包含的关系数量,也就是需要的跳数:直连路径返回1、两跳路径返回2、三跳路径返回3,分组逻辑和需求完全对齐- 随机抽样的逻辑利用了Neo4j
rand()函数返回0(含)到1(不含)之间随机浮点数的特性,乘以分组内路径总数后取整,得到的下标范围刚好是0到分组长度-1,不会出现数组越界问题,也能保证每条路径被抽中的概率均等 - 最终结果只会返回实际存在路径的跳数分组,每个分组仅返回1条随机选取的路径:如果1/2/3跳路径都存在,就会各返回1条;如果某一跳数本身没有可达路径,对应分组不会出现在结果中,不需要额外写判断逻辑
注:以上写法没有给随机函数固定种子,每次执行查询都会得到不同的抽样结果。
内容的提问来源于stack exchange,提问作者user18602652
相关产品推荐
相关产品推荐

