/** * Build the whole cypher query to insert at once all new nodes and relationships * * @param MapInterface<IdentityInterface, object> $entities * * @return QueryInterface */ private function queryFor(MapInterface $entities) : QueryInterface { $query = new Query(); $this->variables = new Set('string'); $partitions = $entities->partition(function (IdentityInterface $identity, $entity) { $meta = $this->metadatas->get(get_class($entity)); return $meta instanceof Aggregate; }); $partitions->get(true)->foreach(function (IdentityInterface $identity, $entity) use(&$query) { $query = $this->createAggregate($identity, $entity, $query); }); $partitions->get(false)->foreach(function (IdentityInterface $identity, $entity) use(&$query) { $query = $this->createRelationship($identity, $entity, $query); }); $this->variables = null; return $query; }