apoc.trigger.toRelationship
Function APOC Full
Signature
apoc.trigger.toRelationship(rel :: RELATIONSHIP, removedRelationshipProperties :: MAP) :: RELATIONSHIP
Usage Examples
This function is intended to be used within an apoc.trigger.install Cypher statement.
If we want to create a 'before' or 'after' trigger query using $deletedRelationships, and retrieve entity information such as the type and/or properties, we cannot use the classic Cypher functions type() and properties().
Instead, we have to leverage virtual relationships through the function apoc.trigger.toRelationship(rel, $removedRelationshipProperties).
For example, to create a new Report node with a list of deleted relationship IDs and the type retrieved for each deleted relationship, we can execute:
CALL apoc.trigger.install(
    'neo4j', 'myTrigger',
    "UNWIND $deletedRelationships as deletedRel
    WITH apoc.trigger.toRelationship(deletedRel, $removedRelationshipProperties) AS deletedRel
    CALL apoc.merge.node(
          ['Report'],
          {type: apoc.rel.type(deletedRel)},
          {created: datetime()},
          {updated: datetime()}
    ) YIELD node AS report
    WITH report, deletedRel
    SET report.deletedIds = coalesce(report.deletedIds, [])+[id(deletedRel)]" ,
    {phase:'before'}
);
Now, let’s create and delete a IN_GENRE relationship between a Movie node and a Genre node:
MERGE (movie:Movie {title: "The White Tiger"})
MERGE (genre:Genre {name: "Triller"})
MERGE (movie)-[IN_GENRE]->(genre);
MATCH (movie:Movie {title: "The White Tiger"})-[r:IN_GENRE]->(genre:Genre {name: "Triller"}) DELETE r;
Finally, let’s check the Report node:
MATCH (report:Report {labels: ['IN_GENRE']})
RETURN report;
| report | 
|---|
(:Report {"created": "2024-12-12T08:33:27.188000000Z", "deletedIds": [12], "type": "IN_GENRE"})  |