Весенние данные / Neo4j @Замена свойства аннотации запроса

#java #spring-boot #neo4j #spring-data #spring-data-neo4j

#java #пружинный ботинок #neo4j #весна-данные #spring-data-neo4j

Вопрос:

Я работаю над службой рекомендаций на основе Spring Data / Neo4j и столкнулся с проблемой с @Query аннотацией. Я пытаюсь передать свойство (the 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

Ответ №1:

Единственная проблема с вашим запросом заключается в том, что вы экранируете строку '$network_userid' like a, но вы должны сделать: @Query("MATCH (n {id: $network_userid }) RETURN n") без указания строкового литерала.