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 保存新关系时,关系会分离_Java_Neo4j_Spring Data Neo4j_Spring Reactive - Fatal编程技术网

Java 保存新关系时,关系会分离

Java 保存新关系时,关系会分离,java,neo4j,spring-data-neo4j,spring-reactive,Java,Neo4j,Spring Data Neo4j,Spring Reactive,早上好,我使用的是SDN-RX,我是通过spring-data-neo4j-RX-spring-boot-starter版本1.0.0-beta04添加的,我的neo4j数据库是版本4.0.2企业版。我有一个ClassificationDomain节点类型,并定义了类型ClassificationDomain的regionClassificationDomain,我将RegionType类型的“大陆”节点附加到该节点,大陆节点是更多区域类型的层次结构的根节点,如下所示: "continent"-

早上好,我使用的是SDN-RX,我是通过spring-data-neo4j-RX-spring-boot-starter版本1.0.0-beta04添加的,我的neo4j数据库是版本4.0.2企业版。我有一个ClassificationDomain节点类型,并定义了类型ClassificationDomain的regionClassificationDomain,我将RegionType类型的“大陆”节点附加到该节点,大陆节点是更多区域类型的层次结构的根节点,如下所示:

"continent"->"country"->"state/province" etc.....
我现在正在定义实际的区域节点,这些节点也是分层的,需要附加到相应的区域类型,如下所示

"africa" -> "zimbabwe" -> "harare" etc
我的问题是,当我保存一个新的region节点时,比如说我想将一个子region附加到“Harare”,regionType层次结构和region层次结构上的许多其他关系都会分离

我错过了什么或做错了什么

我的存储库正在扩展ReactiveNeo4jRepository

波乔地区


    /**
     * Parent relationship to be modeled by IS_PARENT_REGION_OF relationship
     */
    package registry.domain.geography;

    import framework.domain.BayPrincipal;
    import registry.domain.taxonomy.Classification;
    import lombok.Builder;
    import lombok.Getter;
    import lombok.Setter;
    import lombok.ToString;
    import org.neo4j.springframework.data.core.schema.Node;
    import org.neo4j.springframework.data.core.schema.Relationship;

    import java.util.ArrayList;
    import java.util.Set;

    /**
     * @author ltmutiwekuziwa
     *
     */
    @Getter
    @Setter
    @ToString
    @Node("Region")
    public class Region extends BayPrincipal {

        private int regionNumber;
        private String commonName;
        private String officialName;
        private char[] iso2Code = new char[2];
        private char[] iso3Code = new char[3];
        private ArrayList<String> boundingCoordinatess;
        private boolean isMetropolis = false;
        /**
         * Parent region maintained as set to allow for changes without losing the historical record. Only one relationship then
         * should have an open endDate for the relationship
         */
        @Relationship(type="PARENT_REGION", direction= Relationship.Direction.OUTGOING)
        private Set<Region> parentRegions;

        @Relationship(type = "REGION_CLASSIFICATION", direction = Relationship.Direction.INCOMING)
        private Set<Classification> regionClassifications;

        public Set<Region> getParentRegions() {
            return parentRegions;
        }

        public void setParentRegions(Set<Region> parentRegions) {
            this.parentRegions = parentRegions;
        }

        public Set<Classification> getRegionClassifications() {
            return regionClassifications;
        }

        public void setRegionClassifications(Set<Classification> regionClassifications) {
            this.regionClassifications = regionClassifications;
        }
    }

区域控制器,我忽略了导入


    @RestController
    @RequestMapping(value="/api/v1/region")
    public class RegionRestApi extends BayRestApi<Region, RegionRepository, RegionService> {

        private final ArrayList<String> noneIds = new ArrayList<String>(Arrays.asList("none","null", "0", ""));

        @Autowired
        ClassificationService classificationService;

        @Autowired
        public RegionRestApi(RegionService service) {
            super(service);
        }

        @PostMapping("/attach/{parent}/{classification}")
        private Mono<Region> attach(@PathVariable("parent") String parentUuid,
                                    @PathVariable("classification")String  classificationUuid,
                                    @RequestBody Region region) {
            if(!this.noneIds.contains(parentUuid)) {
                region.setParentRegions(new HashSet<Region>(
                        Arrays.asList(this.service.getRepository().findById(parentUuid).block())));
            }
            Classification cls = this.classificationService.getRepository()
                    .findById(classificationUuid).block();
            if(cls != null){
                region.setRegionClassifications(new HashSet<Classification>(
                        Arrays.asList(cls)));
            }

            return this.service.getRepository().save(region);
        }
    }


@RestController
@请求映射(value=“/api/v1/region”)
公共类RegionRestApi扩展了BayRestApi{
private final ArrayList noneIds=新的ArrayList(Arrays.asList(“none”、“null”、“0”、“0”);
@自动连线
分类服务分类服务;
@自动连线
公共区域Restapi(区域服务服务){
超级(服务);
}
@后期映射(“/attach/{parent}/{classification}”)
专用Mono-attach(@PathVariable(“父”)字符串parentUuid,
@PathVariable(“分类”)字符串classificationUuid,
@请求主体区域(区域){
如果(!this.noneIds.contains(parentUuid)){
region.setParentRegions(新哈希集(
Arrays.asList(this.service.getRepository().findById(parentUuid.block());
}
Classification cls=this.classificationService.getRepository()
.findById(classificationUuid).block();
如果(cls!=null){
region.setRegionClassifications(新哈希集(
asList(cls));
}
返回此.service.getRepository().save(区域);
}
}

提前感谢您的帮助。

新答案

您在rest控制器方法中提供的
region
似乎不包含应在
this.service.getRepository().save(region)
调用中持久化的整个图形。 如旧答案(和文档链接)中所述,SDN-RX将更新可从要存储的
区域访问的整个图形。这还包括通过父区域连接的其他区域

一种解决方案是通过自定义Cypher语句来解决这个添加问题(因为您只想添加两个(?)关系)。 另一个解决方案是将您的想法重新构建为更领域驱动的设计,您可以从父区域开始工作,而无需从区域到其父区域的“反向引用”

旧答案(可能仍有助于解决类似问题):

您似乎没有获取要预先持久化的实体的相关节点。 保存数据的那一刻,SpringDataNeo4jRx将Java模型存储在图形中。 这意味着它必须知道它需要为给定实体存储的所有关系

由于您的示例不清楚,我只能猜测您正在加载带有自定义密码的
大陆
地区
部分。 这将导致应用程序中出现子图表示。 对于SDN-RX,这是需要坚持的“真相”


更多详细信息可在此处找到

新答案

您在rest控制器方法中提供的
region
似乎不包含应在
this.service.getRepository().save(region)
调用中持久化的整个图形。 如旧答案(和文档链接)中所述,SDN-RX将更新可从要存储的
区域访问的整个图形。这还包括通过父区域连接的其他区域

一种解决方案是通过自定义Cypher语句来解决这个添加问题(因为您只想添加两个(?)关系)。 另一个解决方案是将您的想法重新构建为更领域驱动的设计,您可以从父区域开始工作,而无需从区域到其父区域的“反向引用”

旧答案(可能仍有助于解决类似问题):

您似乎没有获取要预先持久化的实体的相关节点。 保存数据的那一刻,SpringDataNeo4jRx将Java模型存储在图形中。 这意味着它必须知道它需要为给定实体存储的所有关系

由于您的示例不清楚,我只能猜测您正在加载带有自定义密码的
大陆
地区
部分。 这将导致应用程序中出现子图表示。 对于SDN-RX,这是需要坚持的“真相”


可以在此处找到更多详细信息

您是否可以共享更多的代码?例如,您的实体类和在何处/如何使用存储库?您是否可以共享更多的代码?例如,您的实体类和在何处/如何使用存储库?我已编辑了我的问题,以包括实体类和我调用存储库的控制器。我是n使用自定义cypherthanks@meistermeier将符合您的建议我已编辑了我的问题,以包括实体类和我调用存储库的控制器。我没有使用自定义cypherthanks@meistermeier,将符合您的建议

    @RestController
    @RequestMapping(value="/api/v1/region")
    public class RegionRestApi extends BayRestApi<Region, RegionRepository, RegionService> {

        private final ArrayList<String> noneIds = new ArrayList<String>(Arrays.asList("none","null", "0", ""));

        @Autowired
        ClassificationService classificationService;

        @Autowired
        public RegionRestApi(RegionService service) {
            super(service);
        }

        @PostMapping("/attach/{parent}/{classification}")
        private Mono<Region> attach(@PathVariable("parent") String parentUuid,
                                    @PathVariable("classification")String  classificationUuid,
                                    @RequestBody Region region) {
            if(!this.noneIds.contains(parentUuid)) {
                region.setParentRegions(new HashSet<Region>(
                        Arrays.asList(this.service.getRepository().findById(parentUuid).block())));
            }
            Classification cls = this.classificationService.getRepository()
                    .findById(classificationUuid).block();
            if(cls != null){
                region.setRegionClassifications(new HashSet<Classification>(
                        Arrays.asList(cls)));
            }

            return this.service.getRepository().save(region);
        }
    }