Java 如何在使用Spring数据Neo4j的查询中指定深度?

Java 如何在使用Spring数据Neo4j的查询中指定深度?,java,spring,neo4j,lazy-loading,spring-data-neo4j,Java,Spring,Neo4j,Lazy Loading,Spring Data Neo4j,我尝试用Neo4j和Spring数据(Spring-Data-neo4j4.2.0.RELEASE)创建一个目录结构 我有一个目录bean: @NodeEntity public class Directory { @GraphId private Long id; private String name; @Relationship(type = "HAS_CHILD_CONTENT", direction = Relationship.OUTGOING) p

我尝试用Neo4j和Spring数据(Spring-Data-neo4j4.2.0.RELEASE)创建一个目录结构

我有一个目录bean:

@NodeEntity
public class Directory {
    @GraphId private Long id;
    private String name;

    @Relationship(type = "HAS_CHILD_CONTENT", direction = Relationship.OUTGOING)
    public Set<Directory> subDirectories;

    public void hasChildContent(Directory subDir) {
        if (subDirectories == null) {
            subDirectories = new HashSet<>();
        }
    subDirectories.add(subDir);
}
然后选择根节点:

directoryRepository.findAllRoots();
我得到根目录,将rootLevel1作为subDir,将rootLevel2作为subDir

我只想获取rootLevel1为null的根(作为subDir)。所以我不获取数据库的全部目录

我尝试了@Depth参数,但是调用:

directoryRepository.findOneByName("root", 0);
获取根目录,将rootLevel1作为subDir,将rootLevel2作为subDir。好像深度没有被考虑在内

我怎么能选择一个只有他的子目录,而没有子目录的子目录的节点

谢谢

[编辑]

我发现在集成测试中删除事务性注释会影响SDN的fecthing系统

通过事务性注释,SDN急切地获取所有子目录,并从Neo4J加载整个目录结构

在没有事务性注释的情况下,SDN获取lazyly,my Directory bean的“subDirectories”属性为null

这解决了我的问题,但没有回答后面的问题:如何设置要获取的自定义深度。

您可以考虑

MATCH p=(n:Directory)-[]-m where length(p)=1 return m limit 25


这可能是因为您的写和读共享相同的底层会话

当您读取实体时,SDN/OGM检测到它们已经在会话中(基于id)。它返回它们在会话中的状态,完全填充

当您删除
@Transactional
时,每个db访问都会在一个新的新会话中执行,从而得到预期的结果


如果您出于任何原因需要在写入后立即读取,您可能需要插入一个OGM会话来调用
session.clear()
,以强制刷新会话。

谢谢您的回复。但它不符合我的要求。我认为问题在于SDN4所做的“获取”,因为我想要根目录,而不是它们的子目录。因此,在获取请求后,我需要一个空的subDirectories属性。这似乎是SDN/OGM中的一个bug。可能与……有关。请你提交一个问题好吗?@nMervalie事实上,我有一个奇怪的“bug”。从一开始,我就对测试类进行了事务性注释。但是如果我删除它,Iall目录bean就没有任何子目录。因此,对于事务性SDN,所有关系都是递归的,没有事务性SDN,所有关系都是惰性的,不会被提取。没错,它与事务性注释和会话一起工作。clear()仅在初始化代码之后。谢谢
directoryRepository.findOneByName("root", 0);
MATCH p=(n:Directory)-[]-m where length(p)=1 return m limit 25
match p=(n)-[]-(m) with m, reduce(status ='', q IN nodes(p)| status + 'x') AS c where length(c)=1 return m, c