/**
  * {@inheritdoc}
  */
 public function translate(EntityInterface $meta, SpecificationInterface $specification) : IdentityMatch
 {
     try {
         $mapping = (new RelationshipPropertyMatchVisitor($meta))->visit($specification);
         $query = $this->addProperties($this->addProperties($this->addProperties((new Query())->match('start'), 'start', $mapping)->linkedTo('end'), 'end', $mapping)->through((string) $meta->type(), 'entity', Relationship::RIGHT), 'entity', $mapping);
     } catch (SpecificationNotApplicableAsPropertyMatchException $e) {
         $condition = (new RelationshipCypherVisitor($meta))->visit($specification);
         $query = (new Query())->match('start')->linkedTo('end')->through((string) $meta->type(), 'entity', Relationship::RIGHT)->where($condition->get(0))->withParameters($condition->get(1)->toPrimitive());
     }
     return new IdentityMatch($query->return('start', 'end', 'entity'), (new Map('string', EntityInterface::class))->put('entity', $meta));
 }
 /**
  * {@inheritdoc}
  */
 public function translate(EntityInterface $meta) : IdentityMatch
 {
     $query = (new Query())->match('start')->linkedTo('end')->through((string) $meta->type(), 'entity', Relationship::RIGHT)->return('start', 'end', 'entity');
     return new IdentityMatch($query, (new Map('string', EntityInterface::class))->put('entity', $meta));
 }
 /**
  * {@inheritdoc}
  */
 public function translate(EntityInterface $meta, IdentityInterface $identity) : IdentityMatch
 {
     $query = (new Query())->match('start')->linkedTo('end')->through((string) $meta->type(), 'entity', Relationship::RIGHT)->withProperty($meta->identity()->property(), '{entity_identity}')->withParameter('entity_identity', $identity->value())->return('start', 'end', 'entity');
     return new IdentityMatch($query, (new Map('string', EntityInterface::class))->put('entity', $meta));
 }