Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从数据库加载的@NodeEntity不完整_Java_Neo4j_Spring Data Neo4j_Neo4j Ogm - Fatal编程技术网

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

Java 从数据库加载的@NodeEntity不完整,java,neo4j,spring-data-neo4j,neo4j-ogm,Java,Neo4j,Spring Data Neo4j,Neo4j Ogm,从“Neo4j推荐”教程中,我下载并导入了产品目录数据集。我正在使用对象图映射创建一个SpringNeo4j项目 目前,我已经为产品和类别创建了一个@NodeEntity。为了快速验证是否一切正常,@PostConstruct方法用于ProductService和CategoryService从数据库获取产品和类别 我注意到,如果我查询产品,然后得到产品的类别,然后类别集中的所有产品不包含所有产品,而只包含我开始查询时使用的产品 但是,如果我直接查询类别本身,它确实包含所有产品 private

从“Neo4j推荐”教程中,我下载并导入了产品目录数据集。我正在使用对象图映射创建一个SpringNeo4j项目

目前,我已经为
产品
类别
创建了一个
@NodeEntity
。为了快速验证是否一切正常,
@PostConstruct
方法用于
ProductService
CategoryService
从数据库获取产品和类别

我注意到,如果我查询产品,然后得到产品的类别,然后类别集中的所有产品不包含所有产品,而只包含我开始查询时使用的产品

但是,如果我直接查询类别本身,它确实包含所有产品

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
  public class Product {

  @Id
  private String sku;
  private String name;

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

  @Convert(PriceConverter.class)
  private BigDecimal price;
}
@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<>();
}
类别
实体定义为:

@NodeEntity
  public class Product {

  @Id
  private String sku;
  private String name;

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

  @Convert(PriceConverter.class)
  private BigDecimal price;
}
@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<>();
}
我本以为这套产品会被懒散地评估为全套产品。我需要强迫它这样做吗?其他节点何时加载到
@NodeEntity
,如何确保加载了特定节点的完整子图

编辑: 文档包含以下引用:

对于图到对象映射,相关实体的自动传递加载取决于调用Session.load()时指定的视界深度。默认深度为1表示将加载相关节点或关系实体并设置其属性,但不会填充任何相关实体


这表明应该使用会话对象加载更多数据,但我不知道是哪个会话对象。

您的分析是正确的。Spring数据Neo4j(以及底层OGM)中的默认加载深度为1。当您加载产品时,您将获得其类别,但不会获得其他产品,因为这些产品在图中与原始产品相差2跳。如果您想获取所有相关产品,我可以想出两种可能的方法

  • 从产品中获取产品类别后,使用其id查询类别存储库。这将返回具有该类别的产品列表

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

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

    有关详细信息,请参阅