首页 > 解决方案 > 如何在 Neo4j 中使用带有 `call.apoc.do.when` 的 `with` 语句?

问题描述

首先,您可以使用以下命令创建示例节点,

CREATE (t1:Title { tid: '123abc'})
CREATE (t2:Title { tid: '123def'})
CREATE (t3:Title { tid: '123456'})
CREATE (t4:Title { tid: '123789'})
CREATE (u:User { pid: '456def'})

CREATE (t1)-[r:TO]->(t2)
CREATE (t2)-[r:TO]->(t3)
CREATE (t3)-[r:TO]->(t4)
CREATE (u)-[r:LIKE]->(t3)

这是图表,

图形

我在 Neo4j 中有这样的查询,

MATCH (t1:Title)-[r:TO]->(t2:Title)
WHERE t1.tid = '123abc'
AND NOT exists((t2)<-[:LIKE|:DISLIKE|:LOVE]-(:User {pid: '456def'}))
WITH COLLECT(r) AS rels
LIMIT 1

WITH rels
CALL apoc.do.when(
    SIZE(rels) > 0,
    'RETURN REDUCE(total = 0, x IN rels | total + x.weight) AS result',
    'RETURN 0 AS result'
) YIELD value
RETURN value.result

我想在博客中使用rels变量。do.when表达没有问题SIZE(rels) > 0,但if statement返回这样的错误,

调用过程失败apoc.do.when:原因:org.neo4j.exceptions.SyntaxException:变量rels未定义(第 1 行,第 31 列(偏移量:30))“返回减少(total = 0,x IN rels | total + x.weight)AS结果”

我是 Neo4j 的新手。我认为,有一个特殊情况REDUCE。我怎么解决这个问题?提前致谢。

标签: neo4jcypher

解决方案


可以使用聚合函数 SUM直接获得总和:

MATCH (t1:Title)-[r:TO]->(t2:Title)
WHERE t1.tid = '123abc' AND NOT EXISTS((t2)<-[:LIKE|:DISLIKE|:LOVE]-(:User {pid: '456def'}))
RETURN SUM(r.weight) AS result

推荐阅读