2016-06-26 5 views
2

Предположат, мой Граф, имеющий следующие путинужно найти кратчайший путь между двумя узлами на основе одного из -Использования значения свойства JAVA узла и 3.0.1 Neo4j версии

 (3)<--[IS_LOCATED_AT,9]--(8)--[CARRIES,77]-->(53)<--[CARRIES,76]--(7)--[IS_LOCATED_AT,8]-->(2) 
     (3)<--[IS_LOCATED_AT,9]--(8)--[BELONGS_TO,7]-->(1)<--[BELONGS_TO,6]--(7)--[IS_LOCATED_AT,8]-->(2) 
     (3)<--[IS_LOCATED_AT,9]--(8)--[BELONGS_TO,7]-->(55)<--[BELONGS_TO,61]--(7)--[IS_LOCATED_AT,8]-->(2) 
     (3)<--[IS_LOCATED_AT,9]--(8)--[CARRIES,77]-->(57)<--[CARRIES,75]--(7)--[IS_LOCATED_AT,8]-->(2) 

Подозрение на пути, имеющий ниже упомянутые свойства

 (53) node has the properties--{Name:A} 

    (1) node has properties--{Name:B} 

    (55) node has properties--{Name:C} 

    (57) node has properties-- {Name:D} 

Предположит Если я вызвать shortestpath между узлами (3) и (2), я получаю ниже выходные данные при вызове указанного ниже методом.

предположить, выходной ток:

 (3)<--[IS_LOCATED_AT,9]--(8)--[BELONGS_TO,7]-->(1)<--[BELONGS_TO,6]--(7)--[IS_LOCATED_AT,8]-->(2) 
     (3)<--[IS_LOCATED_AT,9]--(8)--[BELONGS_TO,7]-->(55)<--[BELONGS_TO,61]--(7)--[IS_LOCATED_AT,8]-->(2) 

Но Мое требование 1) Он должен фильтровать пути, основанные на собственности узла перед вызовом shortestpath апи Предположим, мой фильтр {имя: D}, которая является собственностью (57), упомянутый выше

Затем мой вывод должен быть таким, как показано ниже, при вызове метода shortespath, обозначенного ниже, как приведенный ниже путь, имеющий узел (57), имеющий свойство {Name: D}.

Ожидаемый результат с фильтром

  (3)<--[IS_LOCATED_AT,9]--(8)--[CARRIES,77]-->(57)<--[CARRIES,75]--(7)--[IS_LOCATED_AT,8]-->(2) 

Я не хочу использовать шифр для этого. Кто-нибудь может мне помочь.

+0

не совсем понимаю, что вопрос на самом деле здесь. –

+0

Благодарим вас за ответ. Я пытаюсь найти кратчайший путь между двумя узлами, применяя предикат (на основе фильтра значений свойств Node). Можете ли вы дать мне шаги для этого. Я могу добиться этого с помощью версии java версии neo4j 3.0.1. – raj

+0

Код выглядит прекрасно. Возможно, добавление неудачного модульного теста с некоторыми образцовыми данными объясняло бы лучше, почему вышеуказанное не ведет себя так, как вы планируете. –

ответ

1

Если ограничение применяется, по крайней мере, к одному узлу вдоль пути (а не к каждому узлу), фрагмент выше не будет работать. Стратегия применения здесь будет выглядеть следующим образом:

  1. использование shortestPath.findAllPaths без фильтрации для свойства узла
  2. фильтра кратчайшего пути вы нашли в 1), если любой из них содержит узел с заданным свойством. Если да: сделано, иначе:
  3. использование GraphAlgoFactory.pathsWithLength() и попросить путей длины + 1 (где длина является длина кратчайших путей от стадии 1)
  4. проверить, если какой-либо из путей с длиной + 1 удовлетворяет критериям (см. 2). Если не вернуться к 3 с length=length+1

Альтернативным способом будет использовать GraphDatabaseService.bidirectionalTraversalDescription() и применить проверку свойства в таранном оценщике. Но я считаю этот подход более сложным, чем стратегия, очерченная выше.

+0

Спасибо. Stefan.My понимание - проверка свойств может быть выполнена до вызова shortestPath.findAllPaths(), предоставляемого с использованием GraphDatabaseService .bidirectionalTraversalDescription(). Так как это сложно, не могли бы вы опубликовать образец кода, если у вас есть. – raj

+0

некоторые примеры приведены в модульных тестах исходного кода Neo4j: https://github.com/neo4j/neo4j/blob/3.1/community/kernel/src/test/java/org/neo4j/kernel/impl/traversal/TestBidirectionalTraversal .java –

+0

спасибо stefan за помощь. – raj