如何在 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
首先,您可以使用以下命令创建示例节点,
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: Variablerels
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