«Match» на OrientDB возвращает путь, который не существует - PullRequest
0 голосов
/ 29 мая 2018

Я использую OrientDB 'match', чтобы получить путь (на графике) в соответствии с критериями, но я получаю путь к результату, который не существует.

У меня есть вершина "Person", котораяимеет ребро "PhoneCall" для другой вершины "Person" - только один путь должен совпадать!поэтому я ожидаю получить в результате: vertex1-edgeX-vertex2 Например - "Джонн Смит --phoneCallX-- Дэн Смит"

На самом деле я получаю 2 пути:

  1. vertex1-edgeX-vertex2 (Джонн Смит --phoneCallX-- Дэн Смит), но также:
  2. vertex1-edgeX-vertex 1 - это не так, поскольку это одно и то же ребро-@rid из первого результата, а также это НЕ самообладание: jonn Smith --phoneCallX-- jonn Smith

Запрос:

MATCH {class:person, as:E1, where:( (   firstName IN ['John']   ) )}.bothE(){class:phoneCall, as:R0}.bothV(){class:person, as:E0, where:( (   lastName IN ['Smith']   ) )} RETURN $paths

Я думаю, что это происходитиз-за метода «both ()» с того факта, что первая вершина применяется к обоим фильтрам:

  1. firstName IN ['John']
  2. Списокitem lastName IN ['Smith']

Но все же - я хотел найти все пути "John-phoneCall-Smith", и я получил грань (которой не существует) между этим Джоном исам только потому, что его зовут Смит (что должно быть условием ДРУГОЙ сущности этого отношения))

Пожалуйста, помогите мне - что я делаю неправильно?

1 Ответ

0 голосов
/ 29 мая 2018

Вы можете явно указать, что две вершины должны быть разными.Синтаксис в состоянии WHERE E2: $matched.E1 <> $currentMatch

MATCH 
   {class:person, as:E1, where:( (   firstName IN ['John']   ) )}
      .bothE(){class:phoneCall, as:R0}
      .bothV(){class:person, as:E0, where:(lastName IN ['Smith'] AND $matched.E1 <> $currentMatch)} 
RETURN $paths
...