Neo4j: Фильтровать пути, чтобы включить пути только с уникальными промежуточными узлами - PullRequest
0 голосов
/ 15 мая 2018

Я использую следующий запрос neo4j на моем графике:

MATCH (start:N1{id:'xyz'})
CALL apoc.path.expandConfig(start, {sequence:'N1, a>, N2, b>, N3, c>, 
N4', maxLevel:3}) YIELD path
RETURN path
ORDER BY length(path) DESC

Возвращает все пути как

X-a->Y-b->Z-c->**A**
X-a->Y-b->Z-c->**B**
X-a->Y-b->Z-c->**C**
X-a->Y-b->Z
X-a->Y
X
X-a->V
X-a->W

Но все, что я хочу вернуть, это пути, у которых нет повторяющихся более коротких путей, потому что они уже включены в более длинный путь.

Вот вывод, который я хочу:

X-a->Y-b->Z-c->**A**
X-a->Y-b->Z-c->**B**
X-a->Y-b->Z-c->**C**
X-a->V
X-a->W

Может кто-нибудь помочь? Я новичок в Neo4j

1 Ответ

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

В настоящее время шифр не имеет языковых возможностей для проверки того, вложен ли один путь в другой.Но вы можете использовать простой прием: преобразовать идентификаторы отношения пути в текст и сравнить со всеми остальными:

MATCH (start:N1{id:'xyz'})
CALL apoc.path.expandConfig(start, {sequence:'N1, a>, N2, b>, N3, c>, 
N4', maxLevel:3}) YIELD path
WITH path ORDER BY LENGTH(path) ASC
WITH COLLECT(path) AS paths
UNWIND paths AS path
WITH 
  paths, path, 
  apoc.text.join([r in relationships(path)| '' + ID(r)],'.') AS pathTR
  WHERE ALL(p IN paths WHERE 
    CASE 
      WHEN SIZE(pathTR) > 0 AND path <> p AND
           apoc.text.join([r IN relationships(p)| '' + ID(r)],'.') CONTAINS pathTR 
      THEN FALSE 
      ELSE TRUE 
    END 
  )
RETURN path
ORDER BY LENGTH(path) DESC
...