Из одного из руководств «Рекомендации с Neo4j» я скачал и импортировал набор данных каталога продуктов.Я создаю проект Spring Neo4j с использованием Object Graph Mapping.
На данный момент я создал @NodeEntity
для Product
и Category
.Чтобы быстро проверить, все ли в порядке, использовали метод @PostConstruct
для ProductService
и CategoryService
, чтобы получить продукт и категорию из базы данных.
Что я заметил, так это то, что если я запрашиваюпродукт, затем получить категорию продукта, а затем все продукты в наборе категорий содержат не все продукты, а только продукт, с которого я начал запрос.
Однако, если я запрашиваю саму категорию непосредственноон содержит все продукты.
Графическая модель выглядит следующим образом:
Подмножество данных, к которым я обращаюсь,:
Сущность 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, подразумевает, что связанные узлы или сущности отношений будут загружены и их свойства будут установлены, но ни одна из их связанных сущностей не будет заполнена.
Что говорит о том, что объект сеанса следует использовать длязагрузить больше данных, но я не знаю, какой объект сеанса.