gsk308
gsk308

Reputation: 55

how to add variables into neo4j cypher code inside python

I am trying to get a function argument into the cypher code in my python function. The function takes 3 arguments and adds a relation ship of given type between the persons and is as below (the function is based on the example from https://neo4j.com/docs/python-manual/current/get-started/):

def create_and_return_relationship(tx, person1_tid, person2_tid, rel_type):
        query = (
            "MATCH (p1:Person {tid: $person1_tid})"
            "MATCH (p2:Person {tid: $person2_tid})"
            "MERGE (p2)-[r: {REL: $rel_type}]->(p1)"
            "RETURN type(r)"
        )
        result = tx.run(query, person1_tid=person1_tid, person2_tid=person2_tid, rel_type=rel_type)
        try:
            return [{"p1": record["p1"]["name"], "p2": record["p2"]["name"]}
                    for record in result]

How ever when I run the script I get the below syntax error.

neo4j.exceptions.CypherSyntaxError: {code: Neo.ClientError.Statement.SyntaxError} {message: Invalid input '{': expected an identifier (line 1, column 90 (offset: 89))
"MATCH (p1:Person {tid: $person1_tid})MATCH (p2:Person {tid: $person2_tid})MERGE (p2)-[r: {REL: $rel_type}]->(p1)RETURN type(r)"
                                                                                          ^}

is it possible to use variables in the relation part of the cypher query?

Upvotes: 0

Views: 622

Answers (1)

Tomaž Bratanič
Tomaž Bratanič

Reputation: 6514

You cannot use variables for relationship type in Neo4j Cypher. You need to either do string concatenation or use apoc to merge dynamic relationship type:

In your example, you would use:

MATCH (p1:Person {tid: $person1_tid})
MATCH (p2:Person {tid: $person2_tid})
CALL apoc.merge.relationship(p1, $rel_type,{}, {},p2, {})
YIELD rel
RETURN rel;

More info in docs: https://neo4j.com/labs/apoc/4.1/overview/apoc.merge/apoc.merge.relationship/

Upvotes: 1

Related Questions