Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 如何获取spring neo4j cypher自定义查询以填充子关系数组_Spring Boot_Neo4j_Cypher - Fatal编程技术网

Spring boot 如何获取spring neo4j cypher自定义查询以填充子关系数组

Spring boot 如何获取spring neo4j cypher自定义查询以填充子关系数组,spring-boot,neo4j,cypher,Spring Boot,Neo4j,Cypher,默认情况下,对Spring数据Neo4j(SDN)的内置查询返回使用深度1填充的对象。这意味着将填充查询返回的对象的“子对象”(相关节点)。这很好-这些查询返回的对象的引用末尾有实际的对象 默认情况下,自定义查询的深度为0。这是一个麻烦 在中,描述了如何让springboot neo4j填充与自定义查询目标相关的元素,以实现查询结果的额外一级深度 当相关元素位于列表中时,此方法遇到问题: @NodeEntity public class BoardPosition { @Relatio

默认情况下,对Spring数据Neo4j(SDN)的内置查询返回使用深度1填充的对象。这意味着将填充查询返回的对象的“子对象”(相关节点)。这很好-这些查询返回的对象的引用末尾有实际的对象

默认情况下,自定义查询的深度为0。这是一个麻烦

在中,描述了如何让springboot neo4j填充与自定义查询目标相关的元素,以实现查询结果的额外一级深度

当相关元素位于列表中时,此方法遇到问题:

@NodeEntity
public class BoardPosition {

    @Relationship(type="PARENT", direction = Relationship.INCOMING)
    public List<BoardPosition> children;
问题在于,查询似乎为每个子级返回一个单独的结果,而这些结果不用于填充目标中的子级数组

与Spring Neo将子项排序到目标上的数组中不同,我得到的是“只需要1个结果”错误——好像查询返回多个结果,每个结果都有一个子项,而不是一个结果中有子项

org.springframework.dao.incorrectresultsizedaataaccess异常: 结果大小不正确:最多应为1

如何使用自定义查询填充目标的子列表

(请注意,内置的
findByPlay(play)
实现了我想要的功能-内置查询的深度为1而不是0,它返回一个包含填充子项的目标-但我当然需要使查询比“按播放”更复杂一些…这就是我需要解决这个问题的原因)


版本:

org.springframework.data:spring-data-neo4j:5.1.3.RELEASE


neo4j 3.5.0

==编辑======

出现问题的原因是您具有自我关系(同一标签的节点之间的关系)

以下是Spring处理单节点查询的方式:

org.springframework.data.neo4j.repository.query.GraphQueryExecution

@Override
public Object execute(Query query, Class<?> type) {
    Iterable<?> result;
    ....
    Object ret = iterator.next();
    if (iterator.hasNext()) {
        throw new IncorrectResultSizeDataAccessException("Incorrect result size: expected at most 1", 1);
    }
    return ret;
}
如果您的节点具有不同的标签,即不同的类类型,那么ogm只返回与您的查询返回类型相对应的单个节点,没有问题

但是您的节点具有相同的标签,即相同的类类型=>Neo4j OGM无法区分哪个是返回的节点->返回的所有节点A、B、C、D->异常

关于这个问题,我认为你现在应该提交一份bug报告

对于解决方法,您可以更改查询以仅返回
不同的目标。您的\u identity\u属性
identity\u属性
是节点的“主键”,它唯一地标识您的节点)

然后使用该标识属性加载应用程序调用:

public interface BoardRepository extends CrudRepository<BoardPos, Long> {

    @Query("MATCH (target:B) <-[c:PARENT]- (child:B) WHERE target.play={Play} RETURN DISTINCT target.your_identity_property")
    Long findActiveByPlay(@Param("Play") String play);

    BoardPos findByYourIdentityProperty(xxxx);
} 

考虑另一个查询

MATCH (target:BoardPosition {play:{Play}})
RETURN target, [ (target)<-[c:PARENT]-(child:BoardPosition) | [c, child] ]
MATCH(目标:BoardPosition{play:{play})

RETURN target,[(target)您使用的是哪个版本。您可以返回路径吗?返回路径是什么意思?我已经讨论了如何返回节点、关系和属性,但没有看到“路径”?您可以编写自己的拦截器。您的问题似乎与我遇到的有点不同,但它们仍然与投影有关(返回值评估)由自定义查询返回的相同类型节点。因此,请查看我们与michael simons关于Neo4J OGM错误的讨论。它可能也影响了您的用例。因此,如果您仍然看到问题,可能值得尝试一下alpha(或现在的RC)Neo4J OGM的构建。哦,我的天哪,我的箭头可能走错了方向。只是为了快速确认并感谢您的回复。看起来很有希望,我会尽快进行测试。祝您好运@GreenAsJade:)遗憾的是,箭头没有走错方向-现在我再仔细看看,“父节点”的关系意味着“此节点是我的父节点”,并进入目标,即父对象。实体代码的该部分已发布。我想知道我的问题是否与你的不同,因为我的父对象和子对象属于同一类型,而你的类型不同。这是否使neo很难了解我的情况?哦,我知道你的问题,让我来看看现在就承认吧。为了完整起见:
logging.level.org.neo4j.ogm.drivers.bolt.request.BoltRequest=DEBUG
要启用密码登录,我需要阅读neo列表的理解。令我惊讶的是,尽管这在neo浏览器中只返回一条记录(只确认该剧中的一条匹配),它仍然会生成
org.springframework.dao.IncorrectResultSizeDataAccessException:结果大小不正确:最多应为1
。基本上,它应该可以工作。也许您可以尝试执行SSCE并将其上载到此处?
public interface BoardRepository extends CrudRepository<BoardPos, Long> {

    @Query("MATCH (target:B) <-[c:PARENT]- (child:B) WHERE target.play={Play} RETURN DISTINCT target.your_identity_property")
    Long findActiveByPlay(@Param("Play") String play);

    BoardPos findByYourIdentityProperty(xxxx);
} 
@NodeEntity(label = "C")
@Data
public class Child {

    @Id
    @GeneratedValue
    private long id;
    private String name;

    @Relationship(type = "PARENT", direction = "INCOMING")
    private List<Parent> parents;
}

public interface ChildRepository extends CrudRepository<Child, Long> {

    @Query("MATCH (target:C) <-[p:PARENT]- (child:P) " 
        + "WHERE target.name={name} " 
        + "RETURN target, p, child")
    Child findByName(@Param("name") String name);
}

(:C) <-[:PARENT] - (:P)
MATCH (target:BoardPosition {play:{Play}})
RETURN target, [ (target)<-[c:PARENT]-(child:BoardPosition) | [c, child] ]