2014-01-08 6 views
3

Я пытаюсь понять API-интерфейс API-интерфейса Neo4J, но после тщательного чтения я застрял в определенных точках.Neo4j Traversal Framework Expander and Ordering

То, что я, кажется, знаю:

Разница между PathExpander и BranchOrderingPolicy. Согласно моему пониманию, первый говорит, какие отношения могут быть изучены с определенной позиции, а последний определяет порядок, в котором они должны оцениваться.

Я хотел бы знать следующие вещи:

  1. ли и в какой степени это понимание является правильным, или если он может быть изменен, чтобы дать правильное понимание.

  2. Если правильно, как PathExpander отличается от Evaluator.

  3. Как PathExpander и BranchOrderingPolicy работа. То, что я намереваюсь задать, - это , где каждый раз, когда отношения добавляются к обходу, и что он делает с возвращаемым возвратом возвращаемых отношений, всегда консультироваться. Аналогично порядку ветвления.

  4. Во время обхода, как и когда делать компоненты Expander, BranchOrdering, Evaluator, Uniqueness приходят в картину. В принципе, я хотел бы знать алгоритм шаблона, в котором можно было бы сказать, что первый расширитель запрашивает коллекцию отношений для расширения, а затем запрашивает политику, чтобы выбрать один из атрибутов ....

  5. Если это правильно, политика заказа, указанная BranchOrderingPolicy, применяется только к правомочным отношениям (после выполнения расширителя). Возможно, должно быть.

Пожалуйста, включите что-нибудь еще, что может быть полезно при понимании API.

ответ

6

Я попытаюсь описать эти детали в меру своих возможностей.

  1. Как разница между PathExpander и BranchOrderingPolicy: в PathExpander вызывается для каждого обхода ветви в первый раз обход продолжается от этой ветви. (Ветвь обхода - это узел, включающий путь, ведущий к этому узлу, обратите внимание, что может быть много путей, то есть много ветвей одного узла, в основном в зависимости от уникальности). Результатом вызова является Iterator<Relationship>, который лениво обеспечивает новые отношения от этой ветви обхода, когда это необходимо. Это приводит нас к BranchOrderingPolicy, который смотрит на все живые обходные ветви. Под «живым» я подразумеваю ветвь, которая имеет одно или несколько отношений на ней, так что из нее можно создать больше ветвей. Учитывая все живые ветви он выбирает один из них, после его следующего соотношения (полученного из отношений итератора на этой ветке, потенциально, если это первый вызов инициализирует, что итератор с помощью PathExpander (как описано выше).
  2. Разницы между PathExpander и Evaluator : этот раскол очень удобен и разделяет проблемы. увеличивает количество ветвей и Evaluator фильтров, т. е. уменьшает количество ветвей. Расширитель создает новые ветви, которые оцениваются Evaluator.С учетом сказанного вы можете написать PathExpander, который делает обе эти вещи, и это может быть более эффективным. Но удобство их разделения, где может быть несколько Evaluator с, весьма полезно.
  3. см выше (1)
  4. Некоторые это описано в (1), но более широкая картина была бы, что BranchOrderingPolicy является движущей силой в обходе - из каждой живой ветви он выбирает одну и следует ему одно соотношение к новой ветке. Будут созданы только ветви, соответствующие выбранной уникальности. Отношения для ветви удаляются в первый раз, когда это происходит для каждой ветви, в виде итератора ленивых отношений, использующего PathExpander. Новые ветви оцениваются с первого раза, когда они выбираются, когда один результат оценки - независимо от того, является ли эта ветка тупиковой, а другая - включать или не включать ее в результат пользователю.
  5. Я думаю, что выше объясняет, что

Достаточно ли это информация?

+0

спасибо @Mattias ... Я думаю, это было достаточно хорошо для меня, чтобы понять мои собственные понимания. – mickeymoon

 Смежные вопросы

  • Нет связанных вопросов^_^