Incomplete @NodeEntity загружен из базы данных - PullRequest
1 голос
/ 03 июля 2019

Из одного из руководств «Рекомендации с Neo4j» я скачал и импортировал набор данных каталога продуктов.Я создаю проект Spring Neo4j с использованием Object Graph Mapping.

На данный момент я создал @NodeEntity для Product и Category.Чтобы быстро проверить, все ли в порядке, использовали метод @PostConstruct для ProductService и CategoryService, чтобы получить продукт и категорию из базы данных.

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

Однако, если я запрашиваю саму категорию непосредственноон содержит все продукты.

Графическая модель выглядит следующим образом:

enter image description here

Подмножество данных, к которым я обращаюсь,: enter image description here

Сущность Product, определенная как:

@NodeEntity
  public class Product {

  @Id
  private String sku;
  private String name;

  @Relationship(type = "IN_CATEGORY")
  private Category category;

  @Convert(PriceConverter.class)
  private BigDecimal price;
}

Сущность Category определена как:

@NodeEntity
public class Category {
  @Id @GeneratedValue
  private Long id;

  private String name;

  @Relationship(type = "PARENT_CATEGORY")
  private Category parent;

  @Relationship(type = "IN_CATEGORY", direction = Relationship.INCOMING)
  private Set<Product> products = new HashSet<>();
}

Для обоих я создал Repository класс.Если я запрашиваю CategoryRepository' with categoryRepository.findByName ("Столы") `и печатаю результат, у этой категории будет три продукта, как и ожидалось.

Если я запрашиваю ProductRepository для" Постоянного стола с регулируемой высотой "и напечатайте информацию о своей категории, это категория «Столы», но она содержит только один продукт (постоянный стол с регулируемой высотой), а не два других продукта.

private void showInfo(final Category category) {
    System.out.printf("Name:%s%n", category.getName());
    System.out.printf("Parent: %s%n", category.getParent());
    System.out.printf("Products:%s%n", category.getProducts());
}

Я бы ожидал, что набор будетбыли лениво оценены в полный набор продуктов.Нужно ли заставлять это делать это?Когда дополнительные узлы загружаются в @NodeEntity и как вы уверены, что загружен полный подграф для определенного узла?

Редактировать: документация содержит следующую цитату:

Для отображения графа на объект автоматическая транзитивная загрузка связанных объектов зависит от глубины горизонта, указанного в вызове Session.load ().Глубина по умолчанию, равная 1, подразумевает, что связанные узлы или сущности отношений будут загружены и их свойства будут установлены, но ни одна из их связанных сущностей не будет заполнена.

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

1 Ответ

1 голос
/ 03 июля 2019

Ваш анализ верен. Глубина загрузки по умолчанию в Spring Data Neo4j (и соответствующем OGM) равна 1. Когда вы загружаете продукт, вы получите его категорию, но не другие продукты, так как это 2 скачка на графике от исходного продукта. Если вы хотите получить все связанные продукты, я могу подумать о 2 возможных подходах.

  1. Получив категорию продукта из продукта, запросите хранилище категорий с его идентификатором. Это вернет список продуктов с этой категорией.

  2. Установите глубину запроса в исходном запросе продукта равной 2. Методы хранилища данных Spring по умолчанию позволяют указать глубину запроса. После этого все, что связано с этим продуктом, будет возвращено на расстоянии до 2 прыжков от графика.

Существует только один способ загрузить «полный график» для сущности, а именно установить глубину запроса в -1. Если ваша графовая модель не очень плотная, это может сработать для вас. Однако это может вызвать проблемы с производительностью в других обстоятельствах. Кроме того, этот метод не совместим с загрузкой только тех объектов, которые существуют в модели вашего домена. Другими словами, если график содержит узлы и отношения, которые вам не нужны, установка глубины запроса на -1 будет вслепую включать все эти запросы в запрос, только чтобы снова отбросить их, прежде чем возвращать те, которые соответствуют вашему домену. Опять же, в зависимости от соответствия вашей доменной модели и базового графа, это может быть или не быть проблемой.

Пожалуйста, обратитесь к https://neo4j.com/docs/ogm-manual/current/migration/#_performance_and_unlimited_load_depth для более подробной информации

...