使用NeoDash绘制多线图时Cypher变量未定义错误求助
解决Cypher变量未定义错误及多线图适配方案
错误原因
你的Cypher语句中,第二个WITH子句仅保留了city3和score3,之前的score1变量没有被传递到后续逻辑中,导致最后一行引用score1时触发“变量未定义”错误。每次WITH都会重新划定后续可用的变量范围,必须显式传递需要保留的变量或结果。
修正后的单年份单国家测试语句
如果需要计算对应城市的PageRank得分比值,可将第一个查询的结果暂存为集合,再与第二个查询的结果匹配:
// 1. 获取Morocco图中所有城市的PageRank得分并收集 CALL gds.pageRank.stream("Morroco") YIELD nodeId, score AS score1 WITH gds.util.asNode(nodeId).city AS city1, score1 ORDER BY score1 DESC, city1 ASC WITH collect({city: city1, score: score1}) AS moroccoScores // 2. 获取other_countries图中所有城市的PageRank得分 CALL gds.pageRank.stream("other_countries") YIELD nodeId, score AS score3 WITH moroccoScores, gds.util.asNode(nodeId).city AS city3, score3 ORDER BY score3 DESC, city3 ASC // 3. 匹配同名城市,计算得分比值 UNWIND moroccoScores AS morocco WHERE morocco.city = city3 WITH 2019 AS year, morocco.city AS city, morocco.score / score3 AS factor RETURN year, city, factor
如果需要计算国家整体得分总和的比值(而非单城市),可修改为:
// 1. 计算Morocco图的PageRank总得分 CALL gds.pageRank.stream("Morroco") YIELD score AS score1 WITH sum(score1) AS totalMoroccoScore // 2. 计算other_countries图的PageRank总得分 CALL gds.pageRank.stream("other_countries") YIELD score AS score3 WITH totalMoroccoScore, sum(score3) AS totalOtherScore // 3. 计算总比值 WITH 2019 AS year, totalMoroccoScore / totalOtherScore AS factor RETURN year, factor
适配多线图的多年份多国家方案
针对你“不同国家因子随年份变化的多线图”需求,建议使用Cypher投影动态按年份、国家生成子图,避免预先创建大量命名图:
// 定义需要分析的年份范围和国家列表 WITH [2018,2019,2020] AS targetYears, ['Morocco','France','Spain'] AS targetCountries // 遍历每个年份和国家 UNWIND targetYears AS year UNWIND targetCountries AS country // 1. 计算当前国家+年份子图的PageRank总得分 CALL gds.pageRank.stream({ nodeProjection: '*', relationshipProjection: { relation: { type: 'relation', properties: '*', orientation: 'NATURAL', filter: 'r.year = $year AND r.country = $country' } }, parameters: {year: year, country: country} }) YIELD score WITH year, country, sum(score) AS totalScore // 2. 计算基准国家(比如Morocco)同年份的总得分 CALL gds.pageRank.stream({ nodeProjection: '*', relationshipProjection: { relation: { type: 'relation', properties: '*', orientation: 'NATURAL', filter: 'r.year = $year AND r.country = "Morocco"' } }, parameters: {year: year} }) YIELD score WITH year, country, totalScore, sum(score) AS benchmarkScore // 3. 计算因子并返回(适配NeoDash多线图:X轴year,Y轴factor,分组country) RETURN year AS x, totalScore / benchmarkScore AS y, country AS series ORDER BY year, country
关键提示
- 确保GDS投影的节点/关系过滤条件与你的原图结构匹配(
r.year和r.country需对应关系属性名) - NeoDash多线图需要返回X轴字段、Y轴字段和分组字段(如上述的
year、factor、country) - 若性能不足,可预先按年份+国家创建命名图,替换Cypher投影部分
内容的提问来源于stack exchange,提问作者khadija1234
相关产品推荐
相关产品推荐

