Использование api шифрования или обхода для сопоставления только одного узла на крайних сторонах пути

Скажем, у меня есть следующий путь в графике:

(: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 обхода? Или есть лучший способ?

1 ответ

  1. Старый трюк заключается в использовании идентификаторов узлов для заказа пар ( ID(a) < ID(b)), который отфильтровывает «дублирующиеся» результаты. Таким образом, если вы вводите все свои исходные идентификаторы в один запрос, вы можете использовать этот трюк, чтобы отфильтровать дубликаты:

    WITH [1, 2, 3, 4] AS sourceIds
    UNWIND sourceIds AS sourceId
    MATCH (source:Type1)
    WHERE ID(source) = sourceId
    MATCH
      (source)<-[:RelType1]-(:Type2)<-[:RelType2]-
      ()<-[*]-(centernode)-[*]->()
      -[:RelType2]->(:Type2)-[:RelType1]->(target:Type1)
    WHERE ID(source) < ID(target)
    RETURN source, target
    

    Может ли это работать для вашего случая использования?