2016-10-15 12 views
0

У меня есть исходный узел и узел назначения. Я хочу ограничить узлы и типы отношений в пути. Я использую Neo4j Java API.В Neo4j есть ли способ ограничить узлы и типы отношений в пути при использовании Java API?

Рассмотрим следующий пример игрушечный,

У нас есть три человек узлы A, B & C.

Источник Узел: A & Destination Node: B. Между ними существует много других путей. Я хочу, чтобы ограничить пути к определенному формату как-

(person) -[worksAt]-> (company) -[CompetitorOf]-> (company) <-[worksAt]- (person)

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

enter image description here

Примечание:

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

ответ

0

После внимательного прочтения Neo4j java documentation и экспериментировать с кодом, я получил следующее решение трудоспособного

Для фильтрации пути исследован PathFinder создать пользовательский PathExpander с помощью PathExpanderBuilder.

PathExpanderBuilder pathExpanderBuilder = PathExpanderBuilder.empty(); 

pathExpanderBuilder.add(RelationshipType.withName("worksat"), Direction.OUTGOING); 
pathExpanderBuilder.add(RelationshipType.withName("competitorof"), Direction.BOTH); 
pathExpanderBuilder.add(RelationshipType.withName("worksat"), Direction.INCOMING); 

PathExpander<Object> pathExpander pathExpander = pathExpanderBuilder.build(); 

После создания пользовательских PathExpander вы можете использовать его, чтобы создать соответствующий PathFinder, который будет фильтровать обход по PathFinder.

PathFinder<Path> allPathFinder = GraphAlgoFactory.allSimplePaths(this.pathExpander, 4); 


Iterable<Path> allPaths = allPathFinder.findAllPaths(sourceNode, targetNode); 

В нашем примере sourceNode будет 'A' Node и targetNode будет Node B ''.

1

Непонятно, из вашего вопроса, что вы на самом деле пытаетесь вычислить. У вас есть A и B и вы хотите найти, являются ли их компании конкурентами? У вас есть C и вы хотите найти, кто из их друзей работает в конкурирующих компаниях?

Во всяком случае, если вы используете API обхода (вы говорите о путях), вы можете написать пользовательский PathExpander, который будет использовать last relationship в Path, чтобы определить следующий тип отношений, чтобы пройти.

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

Вопреки тому, что вы делаете в Cypher, вы не объявите шаблон, который вы ищете на пути, вы просто вычислите путь, чтобы следовать за желаемым шаблоном.