Nano Hash - криптовалюты, майнинг, программирование

Можно ли создать двунаправленные отношения между узлами с одинаковой меткой?

Узел Person:

  • имя
  • фамилия
  • адрес
  • электронное письмо
  • телефонный номер

Узел компании:

  • Имя
  • адрес
  • электронное письмо
  • телефонный номер

Отношения:

  • Человек - [SPOUSE] - ›Человек
  • Человек - [SIBLING] - ›Человек
  • Человек - [СЕМЬЯ] - ›Человек
  • Компания - [СОТРУДНИК] - ›Человек

Личность:

public class Person {
    @Id
    @GeneratedValue
    Long personId;

    @Builder
    public Test(Long personId, String firstName, String lastName, String address, String email, String phoneNumber) {
        this.personId = id;
        this.firstName = firstName;
        this.lastName = lastName;
        this.addresss = address;
        this.email = email;
        this.phoneNumber = phoneNumber
    }

    @NotEmpty(message = "Please provide a first name")
    String firstName;

    @NotEmpty(message = "Please provide a last name")
    String lastName;

    String address;

    String email;

    String phoneNumber;

    @Relationship(type = "SPOUSE",direction=Relationship.OUTGOING)
    public Set<Person> spouse;

    @Relationship(type = "SIBLING",direction=Relationship.OUTGOING)
    public Set<Person> sibling;

    @Relationship(type = "FAMILY",direction=Relationship.OUTGOING)
    public Set<Person> family;
}

Когда я создаю человека для Джейн, я также добавляю родство с Джоном.

Запуск person.fetchById("29d31f6c-edfe-48a2-9ab2-3baed5d5ae69") извлекает узел Jane с соответствующим узлом-братом John.

{
   "address":"",
   "email":"",
   "phoneNumber":"",
   "personId":"29d31f6c-edfe-48a2-9ab2-3baed5d5ae69",
   "firstName":"Jane",
   "lastName":"Smith",
   "spouse":null,
   "sibling":[
      {
         "address":"",
         "email":"",
         "phoneNumber":"",
         "personId":"f825cedd-7328-4f9d-b0fd-a33726814f25",
         "firstName":"John",
         "lastName":"smith",
         "spouse":null,
         "sibling":[],
         "family":null
      }
   ],
   "family":null
}

Однако родственные отношения должны быть двунаправленными. Запуск person.fetchById("f825cedd-7328-4f9d-b0fd-a33726814f25") извлекает только узел John.

{
   "address":"",
   "email":"",
   "phoneNumber":"",
   "personId":"f825cedd-7328-4f9d-b0fd-a33726814f25",
   "firstName":"John",
   "lastName":"Smith",
   "spouse":null,
   "sibling":null,
   "family":null,
   "closeFriend":null,
   "friend":null
}

Вот в чем проблема. Я мог бы добавить еще одно родство между Джоном и Джейн. Но это фактически создает бесконечный цикл между ними. И результат person.fetchById оказывается мусором.

  1. Есть ли способ ограничить глубину узлов, возвращаемых при выборке узлов?
  2. Я новичок в neo4j, поэтому подозреваю, что мой дизайн неправильный. Как лучше всего моделировать такие отношения?

Ответы:


1

Вы здесь используете SDN?

Из документов Spring Data Neo4j:

Если вас не волнует направление, вы можете указать direction = Relationship.UNDIRECTED, что гарантирует, что по пути между двумя сущностями узла можно будет перемещаться с любой стороны.

31.03.2021
  • Это доступно в 6.0.7? 31.03.2021

  • 2

    Насколько я знаю (я только начинаю изучать Neo4j), у вас не может быть двусторонних отношений, всегда предлагается иметь два направленных.

    Если вы все же решите добавить еще одно отношение в другом направлении, вы можете ограничить количество переходов до одного:

    Как можно Cypher навязывает максимальное количество прыжков только с учетом определенного типа узла?

    Или, если вы хотите увидеть более длинные цепочки отношений, возможно, поставьте условие для результатов, чтобы не возвращать исходный узел в результатах?

    16.04.2021
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..