Статьи

Анонс Neo4j 1.8M04

Содержание этой статьи было первоначально написано командой Neo4j в блоге Neo4j .

Neo4j 1.8 Milestone 4 доступен уже сегодня, предлагая несколько новых способов помочь вам найти счастливые пути. Для запроса графа вы используете обход, который идентифицирует пути узлов и отношений. В этом выпуске обновлены возможности базовой платформы Neo4j Traversal Framework и представлены новые способы использования путей в Cypher.

Граф шерпа Маттиас Перссон

Маттиас Перссон  работает во всей кодовой базе Neo4j, но особенно хорошо знаком с Traversal Framework, основным компонентом ландшафта Neo4j. Он согласился направить нас в обходной путь:
АК : Итак, что же такое обходной путь?
М.П . : Я бы сказал, что один или несколько заданных узлов на вашем графике перемещаются к другим узлам через их взаимосвязанные связи в поисках вашего ответа. Обход можно контролировать по-разному, например, какие отношения необходимо пересечь в любой заданной позиции, упорядочение и так далее. Общий результат — это список путей, из которых можно извлечь соответствующую информацию.
АК : И тогда структура обхода. Это просто для описания обхода?
член парламентаКонечно, это для описания того, куда должен идти обход, а также для реализации самого обхода.
АК : Можете привести пример, например, как мне найти друзей моих друзей?
MP : Итак, здесь отправной точкой является вы, узел, представляющий вас. И вы бы сказали обходу следовать отношениям KNOWS или аналогичным до глубины 2. Также каждый друг друга должен быть возвращен только один раз (такая уникальность по умолчанию). Итак, во встроенном коде:

Iterable<Node> friendsOfFriends = traversal()
  .breadthFirst()
  .relationships(KNOWS)
  .evaluator(Evaluators.atDepth(2))
  .traverse().nodes();

АК : ОК, интересно. Впрочем, это такой другой способ запроса. Для людей, которые плохо знакомы с Traversals, что вы посоветуете, как «получить его»?
М.П . : Рассматривайте обходы как локальные, где вместо того, чтобы иметь всю базу данных и выполнять глобальные запросы путем сопоставления значений, вы начинаете с известной точки, где ваши отношения становятся вашим индексом и ведут к тому, что вы ищете. Таким образом, вы описываете, как будет вести себя обход, куда он должен идти, а не идти, и вы получите обратные вызовы о соответствующих данных, согласно вашему описанию.
АК : А каковы преимущества нового обновления Traversal Framework?
член парламента: Здесь есть некоторые дополнения. Одним из них является двунаправленный обход, который по сути аналогичен описанию двух обходов, по одному с каждой стороны (имеется в виду один или несколько заданных начальных узлов), и где они сталкиваются в середине, будут давать результаты в виде путей. В большинстве сценариев, когда вы знаете как начальный, так и конечный узел (узлы), двунаправленный обход даст вам ваш ответ с гораздо меньшим количеством пройденных отношений, то есть более быстрым обходом. Причина в том, что число взаимосвязей, которые необходимо пройти на каждой глубине, увеличивается в геометрической прогрессии, поэтому, проходя половину глубины с каждой стороны, сокращается этот рост. Реализации «все пути» и «все простые пути» в коллекции graph-algo теперь используют двунаправленные обходы. Дейкстра и А *, вероятно, перейдут к этому, и этоПо сути, это просто небольшое изменение в вашем описании обхода, чтобы сделать его двунаправленным.
Есть также дополнение к «расширителю», то есть тому, который отвечает за решение, каким отношениям следовать, учитывая позицию в обходе. Ранее он мог принимать решения только на основе узла для текущей позиции, но теперь он может просматривать весь путь, ведущий к текущей позиции.
Также некоторые мелочи, такие как возможность получения метаданных об обходе (количество посещенных отношений и т. Д.), Дополнительные удобные методы в интерфейсе Path.
АК : Отлично. Это много хороших вещей. Как пользователи REST смогут воспользоваться этими новыми возможностями?
MP : Ну, скоро вы можете ожидать, что Cypher оптимизирует запросы, которые могут воспользоваться этим. Это обычная вещь, просто продолжайте писать запросы, и мы будем делать их быстрее.
АляскаБольшое спасибо Маттиасу за всю тяжелую работу.

Пути как выражения

В Cypher большая часть работы в заявлении включает работу с путями. Теперь сами пути можно рассматривать как выражения. Это наиболее сразу объясняется простым примером. До версии 1.8.M04 вы могли записать путь с идентификатором, например так:

START n=node(...), m=node(...)
    match p=n-->()<--m
    return collect(p) as allPaths

С путями в качестве выражений это можно переписать как:

START n=node(...), m=node(...)
    return n-->()<--m as allPaths

Просто верните путь, который вы хотите. Конечно, с этим можно сделать гораздо больше забавных вещей, которые мы оставим для изучения в другой раз. Потому что сейчас лучше всего …

Попробуйте Neo4j 1.8.M04

Доступен Neo4j 1.8.M04: