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方法已经拥有它。