Peter
Peter

Reputation: 37

Neo4j - Cypher - Build object where Property is dynamic, like Type(r)

From my searchings I did not find a way to set the property of an object dynamically, only by defining it hardcoded (Like below the "Detail" property)

Here is my sample: Neo4j Graph or via Neo4j Console

MATCH(p:Person)-[r]->(m:Movie)
WITH { Person: p.name,
       Detail: collect(r.roles)
     } AS Result
RETURN Result

My target (not working yet):

MATCH(p:Person)-[r]->(m:Movie)
WITH { Person: p.name,
       CASTED_FOR: // --> Only values(r.roles) for relationship "CASTED_FOR" needed here
       ACTED_IN: // --> Only values(r.roles) for relationship "ACTED_IN" needed here
     } AS Result
RETURN Result

I know I could make e.g. [r:CASTED_FOR] or WHERE Type(r) = "CASTED_FOR", but I don't like to have multiple WITH and MATCH queries.

Thank you

Upvotes: 1

Views: 331

Answers (1)

cybersam
cybersam

Reputation: 66967

This query uses Cypher's list comprehension construct to do what you want:

MATCH (p:Person)-[r]->(:Movie)
WITH p, COLLECT(r) AS rs
RETURN {
  Person: p.name,
  CASTED_FOR: [x IN rs WHERE TYPE(x) = 'CASTED_FOR' | x.roles],
  ACTED_IN:  [x IN rs WHERE TYPE(x) = 'ACTED_IN' | x.roles]
} AS Result

Upvotes: 3

Related Questions