Spring-Neo4j:关系检索不正确

Spring-Neo4j:关系检索不正确,neo4j,spring-data,spring-data-neo4j,Neo4j,Spring Data,Spring Data Neo4j,我有一个实体类,它将自己称为父类 @NodeEntity public class Config { @Id @GeneratedValue private Long id; @Relationship(type = "OVERRIDES", direction="INCOMING") private Config parentConfig; @Properties(allowCast=true, prefix="properties",

我有一个实体类,它将自己称为父类

@NodeEntity
public class Config {

    @Id 
    @GeneratedValue 
    private Long id;

    @Relationship(type = "OVERRIDES", direction="INCOMING")
    private Config parentConfig;

    @Properties(allowCast=true, prefix="properties", delimiter=".")
    private Map<String, String> properties;
    ....
}
@NodeEntity
公共类配置{
@身份证
@生成值
私人长id;
@关系(type=“OVERRIDES”,direction=“INCOMING”)
私有配置parentConfig;
@属性(allowCast=true,前缀=“属性”,分隔符=“.”)
私人地图财产;
....
}

在java代码中运行内置的
findById()
方法时,“parentConfig”始终与子对象相同。我从来没有看到关系的另一端。我做错了什么?

这与预期一样有效,但取决于您希望如何对配置建模

假设您想要表示“Child覆盖父配置”,我将其建模为

CREATE (c:Config {name: 'Parent'}) <- [:OVERRIDES] - (c2:Config {name: 'Child'})
将此转化为一个完整的示例:

import java.util.Optional;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.boot.CommandLineRunner;
导入org.springframework.boot.SpringApplication;
导入org.springframework.boot.autoconfigure.springboot应用程序;
导入org.springframework.data.neo4j.repository.Neo4jRepository;
导入org.springframework.stereotype.Component;
接口ConfigRepo扩展了Neo4jRepository{
可选的findOneByName(字符串名称);
}
@组成部分
类示例实现CommandLineRunner{
@自动连线
私有ConfigRepo ConfigRepo;
@凌驾
公共无效运行(字符串…参数)引发异常{
configRepo.findOneByName(“父项”).ifPresent(c->{
System.out.println(“Config”+c+“有父项”+c.getParent());
});
configRepo.findOneByName(“子”).ifPresent(c->{
System.out.println(“Config”+c+“有父项”+c.getParent());
});
}
}
@SpringBoot应用程序
公共类SorecAssociation应用程序{
公共静态void main(字符串[]args){
run(sorecassocaplication.class,args);
}
}
会回来的

2018-10-10 09:20:21.960  INFO 3832 --- [           main] o.n.o.drivers.bolt.request.BoltRequest   : Request: MATCH (n:`Config`) WHERE n.`name` = { `name_0` } WITH n RETURN n,[ [ (n)-[r_o1:`OVERRIDES`]->(c1:`Config`) | [ r_o1, c1 ] ] ], ID(n) with params {name_0=Parent}
Config Config{name='Parent'} has parent null
2018-10-10 09:20:21.984  INFO 3832 --- [           main] o.n.o.drivers.bolt.request.BoltRequest   : Request: MATCH (n:`Config`) WHERE n.`name` = { `name_0` } WITH n RETURN n,[ [ (n)-[r_o1:`OVERRIDES`]->(c1:`Config`) | [ r_o1, c1 ] ] ], ID(n) with params {name_0=Child}
Config Config{name='Child'} has parent Config{name='Parent'}
如果从子节点的角度将关系建模为传入关系,则必须在节点中反转关系。否则,输出如下:

2018-10-10 09:22:54.929  INFO 3837 --- [           main] o.n.o.drivers.bolt.request.BoltRequest   : Request: MATCH (n:`Config`) WHERE n.`name` = { `name_0` } WITH n RETURN n,[ [ (n)<-[r_o1:`OVERRIDES`]-(c1:`Config`) | [ r_o1, c1 ] ] ], ID(n) with params {name_0=Parent}
Config Config{name='Parent'} has parent Config{name='Child'}
2018-10-10 09:22:54.951  INFO 3837 --- [           main] o.n.o.drivers.bolt.request.BoltRequest   : Request: MATCH (n:`Config`) WHERE n.`name` = { `name_0` } WITH n RETURN n,[ [ (n)<-[r_o1:`OVERRIDES`]-(c1:`Config`) | [ r_o1, c1 ] ] ], ID(n) with params {name_0=Child}
Config Config{name='Child'} has parent null
2018-10-10 09:22:54.929信息3837---[main]o.n.o.drivers.bolt.request.BoltRequest:request:MATCH(n:`Config`),其中n.`name`={`name_0`}与n返回n,[[(n)

这与预期一样有效,但取决于您希望如何对配置进行建模

假设您想要表示“Child覆盖父配置”,我将其建模为

CREATE (c:Config {name: 'Parent'}) <- [:OVERRIDES] - (c2:Config {name: 'Child'})
将此转化为一个完整的示例:

import java.util.Optional;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.boot.CommandLineRunner;
导入org.springframework.boot.SpringApplication;
导入org.springframework.boot.autoconfigure.springboot应用程序;
导入org.springframework.data.neo4j.repository.Neo4jRepository;
导入org.springframework.stereotype.Component;
接口ConfigRepo扩展了Neo4jRepository{
可选的findOneByName(字符串名称);
}
@组成部分
类示例实现CommandLineRunner{
@自动连线
私有ConfigRepo ConfigRepo;
@凌驾
公共无效运行(字符串…参数)引发异常{
configRepo.findOneByName(“父项”).ifPresent(c->{
System.out.println(“Config”+c+“有父项”+c.getParent());
});
configRepo.findOneByName(“子”).ifPresent(c->{
System.out.println(“Config”+c+“有父项”+c.getParent());
});
}
}
@SpringBoot应用程序
公共类SorecAssociation应用程序{
公共静态void main(字符串[]args){
run(sorecassocaplication.class,args);
}
}
会回来的

2018-10-10 09:20:21.960  INFO 3832 --- [           main] o.n.o.drivers.bolt.request.BoltRequest   : Request: MATCH (n:`Config`) WHERE n.`name` = { `name_0` } WITH n RETURN n,[ [ (n)-[r_o1:`OVERRIDES`]->(c1:`Config`) | [ r_o1, c1 ] ] ], ID(n) with params {name_0=Parent}
Config Config{name='Parent'} has parent null
2018-10-10 09:20:21.984  INFO 3832 --- [           main] o.n.o.drivers.bolt.request.BoltRequest   : Request: MATCH (n:`Config`) WHERE n.`name` = { `name_0` } WITH n RETURN n,[ [ (n)-[r_o1:`OVERRIDES`]->(c1:`Config`) | [ r_o1, c1 ] ] ], ID(n) with params {name_0=Child}
Config Config{name='Child'} has parent Config{name='Parent'}
如果从子节点的角度将关系建模为传入关系,则必须反转节点中的关系。否则,输出为:

2018-10-10 09:22:54.929  INFO 3837 --- [           main] o.n.o.drivers.bolt.request.BoltRequest   : Request: MATCH (n:`Config`) WHERE n.`name` = { `name_0` } WITH n RETURN n,[ [ (n)<-[r_o1:`OVERRIDES`]-(c1:`Config`) | [ r_o1, c1 ] ] ], ID(n) with params {name_0=Parent}
Config Config{name='Parent'} has parent Config{name='Child'}
2018-10-10 09:22:54.951  INFO 3837 --- [           main] o.n.o.drivers.bolt.request.BoltRequest   : Request: MATCH (n:`Config`) WHERE n.`name` = { `name_0` } WITH n RETURN n,[ [ (n)<-[r_o1:`OVERRIDES`]-(c1:`Config`) | [ r_o1, c1 ] ] ], ID(n) with params {name_0=Child}
Config Config{name='Child'} has parent null
2018-10-10 09:22:54.929信息3837---[main]o.n.o.drivers.bolt.request.BoltRequest:request:MATCH(n:`Config`),其中n.`name`={`name_0`}与n返回n,[[(n)

谢谢,这很接近!我现在确实获得了parentConfig,但只提高了一个级别。我需要在某个地方指定深度吗?是的。默认情况下,我们将深度限制为1。在上面的示例中添加int类型的参数,并用@depth注释它,然后用所需的深度调用它。默认情况下,许多预定义的查找器方法都有它。谢谢,这是close!我现在确实获得了parentConfig,但只需要向上一级。我需要在某个地方指定深度吗?是的。我们默认情况下将深度限制为1。在上面的示例中,添加int类型的参数,并用@depth注释它,然后用所需的深度调用它。默认情况下,许多预定义的Finder方法已经拥有它。