我的部分项目使用了spring-data-neo4j,我遇到了麻烦。我有节点实体类:
@NodeEntity
@TypeAlias("Ad")
public class Ad{
@GraphId
private Long nodeId;
@Indexed(indexName = "adId", unique = true)
private Long id;
@Fetch
@RelatedTo(type="CONTAINS", direction = Direction.OUTGOING)
private Collection<Keyword> keywords;
...
使用此类方法的存储库:
@Query(value = "START ad1=node({adv}) MATCH ad1-[r1:CONTAINS]->Keyword<-[r2:CONTAINS]-similar RETURN similar SKIP {param_offset} LIMIT {param_limit}")
Iterable<Ad> findSimilarAds(@Param("adv") Ad advertising, @Param("param_limit") int limit, @Param("param_offset") int offset);
@Query(value = "START ad1=node:adId(id={p_id}) MATCH ad1-[r1:CONTAINS]->Keyword<-[r2:CONTAINS]-similar RETURN similar SKIP {param_offset} LIMIT {param_limit}")
Iterable<Ad> findSimilarAdsById(@Param("p_id") Long id, @Param("param_limit") int limit, @Param("param_offset") int offset);
然后进行测试,其中包含以下内容:
创建关键字1,创建关键字2 - 确定
创建ID为123456且包含关键字1和关键字2的广告节点 - 确定
创建ID为654321的广告节点,其中包含关键字1 - 确定
获取ID为654321的广告 - 工作正常,生成的查询为:
START ad
= node adId
(id
= {0})返回ad
参数{0 = 654321}
使用findSimilarAds()获取类似广告,参数为上一步广告 - 效果很好,返回ID为123456的广告,生成查询:
START ad1 = node({adv})MATCH ad1- [r1:CONTAINS] - &gt; Keyword&lt; - [r2:CONTAINS] -similar RETURN类似SKIP {param_offset} LIMIT {param_limit} params {param_offset = 0,param_limit = 10,adv = 48}
之后,使用findSimilarAdsById()方法获取类似广告 - id参数为654321L。结果查询如下所示:
START ad1 = node:adId(id = {p_id})MATCH ad1- [r1:CONTAINS] - &gt; Keyword&lt; - [r2:CONTAINS] -similar RETURN类似SKIP {param_offset} LIMIT {param_limit} params {param_offset = 0,p_id = 654321,param_limit = 10}
但它返回空的org.springframework.data.neo4j.conversion.QueryResultBuilder实例(我正在尝试使用迭代器获取元素)而不是使用Ad 123456的Iterable集合。 我已经尝试了几乎所有我能想到的东西,没有任何成功,我错过了一些重要的东西吗?
版本:
答案 0 :(得分:0)
我认为你在数字索引问题中运行,这对cypher不起作用。由于lucene解析器的问题。
如果您使用
@Indexed(indexName = "adId", unique = true, numeric=false)
private Long id;
它应该有用。
或者您必须传递ValueContext.numeric(id)
而不是Long id
作为方法的参数。
对于派生的查找程序,我们会自动处理,但对于用户定义的查询,我们无法知道您实际传入的内容。