-6ren">
gpt4 book ai didi

neo4j - 映射异常与 Neo4j 和 Spring Data 中相同类型的两个节点之间的关系

转载 作者:行者123 更新时间:2023-12-05 07:37:42 30 4
gpt4 key购买 nike

当我尝试检索具有相同标签(相同类型)的两个节点以及两个 spring 数据之间的关系时,我遇到了问题。

enter image description here

我查询了最后一个,就像这样:

 @Query("MATCH (b1:Block)-[rel]->(b2) " +
"WHERE NOT (b1)<-[]-() " +
"RETURN *; ")
Block findLast();

block 属性是:

 @GraphId
private Long id;

private String hash;

@Relationship(direction = Relationship.OUTGOING)
private Block predecessor;

问题是 ogm 说有两个结果(我假设是 b1 和 b2),并抛出这个异常:

Caused by: java.lang.RuntimeException: Result not of expected size. Expected 1 row but found 2
at org.neo4j.ogm.session.delegates.ExecuteQueriesDelegate.queryForObject(ExecuteQueriesDelegate.java:73) ~[neo4j-ogm-core-2.1.5.jar:na]
at org.neo4j.ogm.session.Neo4jSession.queryForObject(Neo4jSession.java:382) ~[neo4j-ogm-core-2.1.5.jar:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_121]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_121]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_121]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_121]

我明白OGM不能选择在@Query方法中返回什么节点,因为找到两个相同类型的节点,但是我如何将第二个填充到第一个?

谢谢!!!!

最佳答案

您对 OGM 在这种情况下使用自定义查询的行为的解释是正确的。 OGM 没有机会区分这两个 Block 实体。

我确实认为你在这里唯一的选择是引入一个 @QueryResult 类并返回它的一个实例而不是一个 Block 对象。

@QueryResult
public class BlockResult {
private Block predecessor;
/* other fields and/or relationships */
}

此类需要存在于实体扫描包中。然后,您可以将带注释的查询方法更改为类似以下内容:

@Query("MATCH (b1:Block)-[rel]->(b2) " +
"WHERE NOT (b1)<-[]-() " +
"RETURN b1, rel, b2 as predecessor; ")
Block findLast();

这里重要的一点是 as predecessor 部分,因为 SDN 需要知道结果中的“列”名称才能在 QueryResult 对象中匹配它。

关于neo4j - 映射异常与 Neo4j 和 Spring Data 中相同类型的两个节点之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48389767/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com