自定义查询中相同标签的节点深度

depth in nodes of the same label in custom query

我的数据库 Company 中有:

@Relationship(type = "COLLECTS_FROM")
private Set<Company> subCompanies

我想要实现的是创建两个查询:

我曾尝试过几次来解决这个问题,以下是这些:

    @Query("Match (company:Company {name:$name})-[relation:COLLECTS_FROM*0..2]->(secondCompany:Company) RETURN company,relation,secondCompany")
    Company customerWithCustomDepth(String name);

不幸的是,当我使用相同的节点类型 运行 进入 IncorrectResultSizeDataAccessException: Incorrect result size: expected at most 1 并且当我将 return 类型更改为列表时,3 条记录被 returned(实际上是其中第一个是我想要得到的,但似乎在 return 语句中指定 secondCompany 会填充我不想在我的 return 类型中包含的节点。

@Query("Match p = (company:Company {name:$name})-[relation:COLLECTS_FROM*0..2]->(secondCompany:Company) RETURN p")
@Query("MATCH (company:Company {name:$name} ) WITH company MATCH p=(company)-[COLLECTS_FROM*0..2]->(m) RETURN p")

基本上就是这样。我觉得我很接近,但缺少一些细节。也许不是试图修复查询,我应该以某种方式限制结果以从查询中获取第一行?非常感谢任何帮助。

收到@cybersam 回复后更新:

这个查询的一般目的是创建一个树图,这就是为什么我想得到一家公司及其子公司(以及子公司中的公司),而不仅仅是母公司。

我可以使用第二种或第三种方法,只在服务器端获取第一个元素:

result.stream()
.findFirst()
.orElseThrow();

但我相信服务端应该可以做到。

到 return 具有指定 nameCompany 如果它通过 1 到 2 COLLECTS_FROM 关系的路径连接到后代 Company 节点:

@Query("MATCH p=(c:Company {name:$name})-[:COLLECTS_FROM*..2]->(:Company) WHERE ALL(n IN NODES(p) WHERE 'Company' IN LABELS(n)) RETURN c")
Company customerWithCustomDepth(String name);

我假设如果没有这样的后代,您不想得到结果,这就是 variable-length relationship 模式不使用 *0..2.

的原因

注意:如果要测试长度恰好为 2 的路径,请将 ..2 更改为 2

任意长度路径的对应查询只需将..2改为..即可。但是,不建议使用没有上限的可变长度关系模式,因为它们可能会“永远”到 运行 或 运行 内存不足。