我目前正在尝试在 Neo4j 数据库中查询从一个节点到另一个节点的所有路径。我已经能够毫无问题地创建节点和关系。然而,当涉及到映射查询结果时,我本质上是试图获取两个节点之间的所有路径(带有节点和关系)并将其映射到 Kotlin 类,但出现了问题。
这是我的存储库层和相应的查询:
import com.nextbus.nextbusapi.DTO.RelationshipDTO
import com.nextbus.nextbusapi.entity.MyNode
import org.springframework.data.neo4j.repository.Neo4jRepository
import org.springframework.data.neo4j.repository.query.Query
import org.springframework.data.repository.query.Param
interface MyNodeRepository : Neo4jRepository<MyNode, Long>{
fun findByName(name:String): MyNode?
@Query(
"""MATCH p = ( :MyNode {name: 'istanbul'})-[*]-( :MyNode {name: 'ankara'})
WITH relationships(p) AS rels
RETURN collect(rels)""",
)
fun findPathsBetweenNodes(
@Param("startNodeName") startNodeName: String,
@Param("endNodeName") endNodeName: String
): List<List<RelationshipDTO>>
}
当我运行上面的查询时,Neo4j 浏览器中的返回值如下:
因此,拥有如下 DTO 对我来说似乎完全没问题:
data class RelationshipDTO(
val identity: Long,
val start: Long,
val end: Long,
val type: String,
val properties: MutableMap<String, String>,
val elementId: String,
val startNodeElementId: String,
val endNodeElementId: String
)
但是,当我尝试在其中一个端点返回 DTO 时,出现以下错误:
2024-02-14T16:10:27.669 + 03:00错误1884 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]:servlet [dispatcherServlet]的Servlet.service() ] 在路径 [] 的上下文中抛出异常 [请求处理失败:org.springframework.dao.InvalidDataAccessApiUsageException:任何列表?不是一个带键的集合;错误代码“N/A”]及其根本原因
org.neo4j.driver.exceptions.value.NotMultiValued:任何列表?不是一个带键的集合
我还尝试将存储库函数的返回类型更改为 List
响应中返回的是:
[ { “空”:假, “假”:假, “真假, “空”:假 } ]
我尝试访问存储在查询返回的路径变量中的变量(例如 path[0].values[0].values[0].adapted.start),但 IDE 不允许我这么做。不确定,但它可能与这些变量是“字段”有关
因此,如果您能帮我解决这个问题,我将非常感激。
是的,我刚刚遇到了类似的问题,但我找到了解决方案,https://docs.spring.io/spring-data/neo4j/docs/6.0.15/reference/html/#projections.sdn.full-例子
这是官方的api链接,这可能会有所帮助,顺便说一句,neo4j的查询注释只能返回平面地图的结果,所以它可能不会返回List>