Подтвердить что ты не робот

Возврат только простых путей в запросе Neo4j Cypher

Задайте запрос следующим образом:

START n = node(123)
MATCH p = n-[r:LIKES*..3]->x
RETURN p;

Пути результатов, которые я получаю с запросом выше, содержат циклы.

Как я могу вернуть только простые пути?

Учитывая этот пример:

  • Как я могу избежать путей с повторяющимися узлами, такими как: [Neo, Morpheus, Trinity, Morpheus, Neo]
4b9b3361

Ответ 1

Указание уникальности путей - это запланированная функция cypher.

Итак, прямо сейчас мы должны убедиться, что no node является дубликатом пути.

Существует предикат ALL, который должен иметь значение true для всех элементов коллекции (какой путь). И с помощью filter вы можете извлечь элементы коллекции, для чего выполняется определенное условие.

START neo=node(1) 
MATCH path= neo-[r:KNOWS*..4]->other 
WHERE ALL(n in nodes(path) where 
          1=length(filter(m in nodes(path) : m=n))) 
RETURN neo, LENGTH(path) AS length, EXTRACT(p in NODES(path) : p.name), other 
ORDER BY length

Так что я сделал:

  • Для всех узлов пути n
  • Отфильтровать путь для узлов, которые равны n
  • определить length этой коллекции
  • утвердить с помощью ALL, что он должен быть ОДНО для каждого n

см. http://console.neo4j.org/r/dpalbl

Ответ 2

Мое обходное решение для этого:

START n = node(123), x=node(*)
MATCH p = shortestPath(n-[r:LIKES*..3]->x)
RETURN p;

см. пример в консоли

Ответ 3

В 2.3.0 используйте следующее:

MATCH path = (start {id:2})<-[*1..]-(end {id:3}) 
WHERE ALL(n in nodes(path) where 
          1 = size(filter(m in nodes(path) where m=n))) 
RETURN start, LENGTH(path) AS length, EXTRACT(p in NODES(path) | p.id), end
ORDER BY length