You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 16:45:54