Скажем, у меня есть следующий путь в графике:
(:Type1)<-[:RelType1]-(:Type2)<-[:RelType2]-()<-[*]-(centernode)-[*]->()-[:RelType2]->(:Type2)-[:RelType1]->(:Type1)
Учитывая <id>
(:Type1)
узел на левой стороне, я могу MATCH
выше пути и получить соответствующий (:Type1)
узел на правой стороне (обратите внимание, что путь симметричен, и его центром является узел (centernode)
). В моем usecase мы получаем <id>
s (:Type1)
узла, получаем соответствующий (:Type1)
узел на другой стороне и затем обрабатываем дальше.
Однако может случиться, что я получу <id>
s обоих узлов (:Type1)
. В этом случае отдельные запросы будут запущены, начиная с соответствующего узла, и будут оцениваться к (:Type1)
узлу на другой стороне, таким образом, дальнейшее выполнение будет продолжаться на обоих узлах.
Q1. Как избежать обработки обоих узлов. То есть, если дали два <id>
с (:Type1)
узлов, которые находятся на крайних сторонах тому же пути, как я могу обеспечить только один из запросов, начиная с одного из этих узлов узла на другой стороне выполняется так, чтобы только один из этих узлов являются дальнейшей обработки и других узлов говорят временно буфер для последующей обработке (если обработка первого узла).
Добавлено: выше у меня есть один путь с двумя (:Type1)
узлами на его крайних сторонах. У меня может быть три или более путей, исходящих из (centernode)
и заканчивающихся в (:Type1)
узле. Поэтому я хочу, чтобы только один из этих (:Type1)
узлов был обработан первым, а следующий (:Type1)
узел будет обработан только в случае сбоя предыдущей обработки.
Q2. Возможен ли такой сценарий с pure cypher? Или я должен в конечном итоге использовать API обхода Neo4J? Если да, то как это можно сделать, так как я должен гарантировать уникальность узлов/отношений, посещаемых через два разных траверса.
Q3. Как я могу добавить расширитель пути в API обхода, чтобы соответствовать пути типа (:Type1)<-[:RelType1]-(:Type2)<-[:RelType2]-()
. Должен ли я делать что-то подобное:
at each traversal `next()`
if (node is of Type1)
follow <-[:RelType1]-
if (node is of Type2)
follow <-[:RelType2]-
(Выше-псевдокод. Я новичок в API обхода. Я просмотрел все документы и примеры. Таким образом, я предполагаю, что внутри расширителя я должен поставить if()
фильтры, чтобы проверить текущий тип узлов и решить, какой тип связи и его направление для расширения далее. Выше псевдокод предназначен, чтобы указать, что.)
Вот как такой шифр может быть записан в API обхода? Или есть лучший способ?
Старый трюк заключается в использовании идентификаторов узлов для заказа пар (
ID(a) < ID(b)
), который отфильтровывает «дублирующиеся» результаты. Таким образом, если вы вводите все свои исходные идентификаторы в один запрос, вы можете использовать этот трюк, чтобы отфильтровать дубликаты:Может ли это работать для вашего случая использования?