【问题标题】:Spring Data / Neo4j @Query annotation property substitutionSpring Data / Neo4j @Query 注解属性替换
【发布时间】:2021-03-13 01:54:54
【问题描述】:

我正在开发基于 Spring Data / Neo4j 的推荐服务,但遇到了 @Query 注释的问题。我正在尝试将属性(network_userid)传递给 Cypher 查询:

package io.woolford.neo4j.repository;

import io.woolford.neo4j.entity.PageUrl;
import org.springframework.data.neo4j.annotation.Query;
import org.springframework.data.neo4j.repository.Neo4jRepository;
import org.springframework.data.repository.query.Param;

import java.util.List;


public interface RecommendationsRepository extends Neo4jRepository<PageUrl, Long> {
    @Query("MATCH (n {id: '$network_userid' }) RETURN n")     // simplified query for brevity
    List<PageUrl> getRecommendations(@Param("network_userid") String network_userid);
}

我认为这就像在属性名称前放置一个美元符号以用属性值替换属性名称一样简单(如上所述)。我预料到了:

MATCH (n {id: '1447e32a-3381-4e61-a8ae-9a05b8df4ddb'}) RETURN n

当我打开调试时,Cypher 查询似乎没有用值替换属性:

[nio-8080-exec-1] o.n.o.drivers.bolt.request.BoltRequest   : Request: MATCH (n {id: '$network_userid' }) RETURN n with params {0=1447e32a-3381-4e61-a8ae-9a05b8df4ddb, network_userid=1447e32a-3381-4e61-a8ae-9a05b8df4ddb}

为了更好的衡量,我做了一个数据包捕获来查看通过网络发送的内容:

...d'...............+MATCH (n {id: '$network_userid' }) RETURN n..0.$1447e32a-3381-4e61-a8ae-9a05b8df4ddb.network_userid.$1447e32a-3381-4e61-a8ae-9a05b8df4ddb......?..n.....

...这再次表明没有发生属性替换。

你能看出我做错了什么吗?

源码:https://github.com/alexwoolford/snowplow-neo4j-recommender

【问题讨论】:

    标签: java spring-boot neo4j spring-data spring-data-neo4j


    【解决方案1】:

    您的查询的唯一问题是您将'$network_userid' 像字符串一样转义,但您应该这样做: @Query("MATCH (n {id: $network_userid }) RETURN n") 没有字符串文字指示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      相关资源
      最近更新 更多