使用 apoc.periodic.iterate 在 Neo4j 数据库中添加新关系

Adding New Relationships in Neo4j Database using apoc.periodic.iterate

我有一个包含两种节点的 Neo4j 数据库 - 作者和文章。有些文章有不止一位作者。我试图在共同撰写一篇文章的作者之间建立一种无向关系。我当前的非功能性查询是这样的:

CALL apoc.periodic.iterate(
    "MATCH (a:Author) WHERE (a)-[:WROTE]->()<-[:WROTE]-(b:Author) RETURN a,b",
    "WITH {a} AS a, {b} as b CREATE (a)-[r:COAUTHOR]-(b)", {batchSize:10000, parallel:true})

我收到以下错误:

Failed to invoke procedure apoc.periodic.iterate: Caused by: org.neo4j.exceptions.SyntaxException: PatternExpressions are not allowed to introduce new variables: 'b'. (line 1, column 60 (offset: 59)) "EXPLAIN MATCH (a:Author) WHERE (a)-[:WROTE]->()<-[:WROTE]-(b:Author) RETURN a,b"

我可以看出问题是我在第一个 MATCH 状态中尝试做的太多,但我是 Cypher 的新手并且无法分解它。

非常感谢, 约翰

问题源于你的第一句话:

MATCH (a:Author)
WHERE (a)-[:WROTE]->()<-[:WROTE]-(b:Author)
RETURN a,b

Cypher 不允许在查询的 WHERE 部分引入新变量,因此您的 (b:Author) 将不被允许,因为它位于 WHERE 子句中。

要修复,请将 (b:Author) 移至 MATCH 语句。此外,如果您在 WHERE 子句上找到模式,您应该使用 exists() 函数以便 return 一个布尔值。

MATCH (a:Author), (b:Author)
WHERE exists((a)-[:WROTE]->()<-[:WROTE]-(b))
RETURN a, b