Повторяющиеся свойства Neo4j ShortestPath - PullRequest
0 голосов
/ 17 сентября 2018

В настоящее время я использую встроенный алгоритм кратчайшего пути из Neo4j.

MATCH p = shortestpath((s:Node {Name: "A"})-[Link*1..500]->(e:Node {Name: "B"})) 
WHERE ALL(x in relationships(p) WHERE x.Value = true)
RETURN p

Проблема в том, что когда я запускаю алгоритм, он может вернуть 2-ю букву «B», несмотря на прохождение первой «B» (оранжевая линия). Как бы заставить его просто вернуть первый экземпляр "B"?

Я знаю, что мог бы просто решить проблему, используя уникальные идентификаторы, но мне нужно использовать имена.

enter image description here

public class Node
{
   public long Id {get;set;}
   public string Name {get;set;}
   public long X {get;set;}
   public long Y {get;set;}
}

public class Link {
   public bool Value {get;set;}
   public long Length {get;set;}
}

Заранее спасибо и не стесняйтесь задавать вопросы.

1 Ответ

0 голосов
/ 17 сентября 2018

Используя ваш запрос, neo4j найдет каждый узел A и каждый узел B, а затем найдет все кратчайшие пути от каждого A до каждого B. То, что отображается в пользовательском интерфейсе консоли, - это все результирующие узлы этого запроса со всеми связями, связывающими каждый из них. Если вы нажмете кнопку _Text_ в левой части окна запроса, станет яснее, что происходит. Вы увидите дискретную строку для каждого кратчайшего пути, сопоставленного между узлами A dn B.

После прочтения вашего вопроса, я ожидаю, что после этого вы получите запрос, который соответствует конкретному узлу A, а затем пересекает его, пока не встретит узел B.

Вызов процедуры расширения пути apoc может лучше соответствовать вашим потребностям. Если бы вы могли добавить метку B к узлу (узлам) B, то вы могли бы использовать apoc.path.expand, чтобы найти искомый путь.

Вы можете использовать следующее для установки метки B.

MATCH (n:Node {Name: 'B'}
SET n:B

Вот пример запроса с использованием apoc.path.expand, который должен останавливаться на первом B найденном узле.

MATCH (a:Node {Name: 'A'})
WITH a
CALL apoc.path.expand(a, 'Link', '+Node|/B', 1, 500) YIELD path
RETURN path
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...