Search code examples
neo4jneo4j-apoc

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


I have a Neo4j database with two kinds of nodes - Authors and Articles. Some of the articles have more than one author. I am trying to create an undirected relationship between the authors who worked together on an article. My current non-functional query is this:

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})

I get the following error:

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"

I can see that the issue is that I am trying to do too much in the first MATCH statemetn, but I'm new to Cypher and am having trouble breaking it up.

Thanks very much, John


Solution

  • The problem stems from your first statement:

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

    Cypher does not allow introducing new variables on the WHERE part of the query, so your (b:Author) will not be allowed since it's located on the WHERE clause.

    To fix, move (b:Author) to the MATCH statement. Also, if you are finding a pattern on the WHERE clause, you should use the exists() function in order to return a boolean.

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