如何在 Neo4j 中使用带有 `call.apoc.do.when` 的 `with` 语句?

How can I use the `with` statement with `call.apoc.do.when` in Neo4j?

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

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

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

Failed to invoke procedure apoc.do.when: Caused by: org.neo4j.exceptions.SyntaxException: Variable rels not defined (line 1, column 31 (offset: 30)) "RETURN REDUCE(total = 0, x IN rels | total + x.weight) AS result"

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

查看 documentation,您可以添加第三个参数,其中包括内部语句的参数:

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',
    {rels:rels}
) YIELD value
RETURN value.result

总和可以直接使用aggregation function 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