从数据库加载的@NodeEntity不完整

时间:2019-07-03 08:50:18

标签: java neo4j spring-data-neo4j neo4j-ogm

我从“ Neo4j的建议”教程之一下载并导入了产品目录数据集。我正在使用对象图映射创建Spring Neo4j项目。

目前,我已经为@NodeEntityProduct创建了一个Category。为了快速验证是否一切正常,请对@PostConstructProductService使用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(“ Desks”)`并打印结果,则该类别具有预期的三种产品。

如果我在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 个答案:

答案 0 :(得分:1)

您的分析是正确的。 Spring Data Neo4j(及其基础的OGM)中的默认加载深度为1。加载产品时,您将获得其类别,但不会获得其他产品,因为图中的距离原始产品有2跳。如果您想获取所有相关产品,我可以考虑两种可能的方法。

  1. 已经从产品获得了产品类别,请使用其ID查询类别存储库。这将返回具有该类别的产品列表。

  2. 将原始产品请求的查询深度设置为2。默认的Spring Data存储库方法允许您指定查询深度。然后,它将返回与该产品相关的所有内容(在图中距离该产品最多2跳)。

只有一种方法可以为实体加载“完整图”,即将查询深度设置为-1。如果您的图形模型不是特别密集,这可能适合您。但是,它可能在其他情况下导致性能问题。同样,此技术与仅加载域模型中存在的那些实体不兼容。换句话说,如果图形包含您不想要的节点和关系,则将查询深度设置为-1将盲目地将所有这些节点和关系包含在查询中,只是在返回与您的域匹配的那些节点之前再次丢弃它们。同样,根据您的域模型和基础图之间的匹配,这可能是问题,也可能不是问题。

有关更多详细信息,请参阅https://neo4j.com/docs/ogm-manual/current/migration/#_performance_and_unlimited_load_depth