将 Cypher 查询结果映射到 DTO

Map Cypher query result to DTO

我想将密码查询结果映射到 DTO/POJO class。我在 neo4j 中定义了以下实体:

  1. Products ,具有属性;姓名、职务、地址
  2. 卖家,有房产;姓名、身份证
  3. Listings,有属性;姓名、身份证

关系定义为:产品 -> 卖家和卖家 -> 列表

我的查询结果是List of Product.Name, [ {Listings.Name, Listings.Id, Sellers.Id, Sellers.Name} ]。 我希望将其映射到 DTO,我无法将具有不同节点和标签的结果映射到 DTO/POJO class.

正如您已经注意到的,Spring Data Neo4j 在映射不能直接应用于一个域实体的“任意”数据时更加严格。 但另一方面 Spring Data Neo4j 也提供了对映射松散数据的支持 Neo4jClient。 示例:

class SoldProductInformation {
   String productName;
   Set<SellingInformation> sellingInformation;
}

class SellingInformation {
   String listingsName;
   String listingsId;
   String sellerName;
   String sellerId
}
neo4jClient.query("...return product.name as productName, someListWithTheInformationFromTheQuestion")
  .fetchAs(SoldProductInformation.class)
  .mappedBy((TypeSystem t, Record record) -> {
         String productName = record.get("productName").asString();
         List<SellingInformation> sellingInformations = record.get("someListWithTheInformationFromTheQuestion").asList(value -> {
             String listingsName = value.get("listingsName").asString();
             // same for listingsId, sellerName, sellerId...
             return new SellingInformation(....);
         });
         return new SoldProductInformation(....);
  })

如果你有更多的实体对齐字段 and/or 也许 return 还有节点,你可以使用派生映射函数:

BiFunction<TypeSystem, MapAccessor, Product> mappingFunction = neo4jMappingContext.getRequiredMappingFunctionFor(Product.class);

并通过

应用
neo4jClient.query("...return product,...")
  .fetchAs(SoldProductInformation.class)
  .mappedBy((TypeSystem t, Record record) -> {
      Product product = mappingFunction.apply(typeSystem, record.get("product"));
      String productName = product.getName();
// ....

有关完整示例,请参阅 https://github.com/spring-projects/spring-data-neo4j/issues/2288#issuecomment-861255508