Spring Data Neo4j存储库返回空集合

时间:2014-02-18 15:22:14

标签: neo4j cypher spring-data-neo4j

我的部分项目使用了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. 创建关键字1,创建关键字2 - 确定

  2. 创建ID为123456且包含关键字1和关键字2的广告节点 - 确定

  3. 创建ID为654321的广告节点,其中包含关键字1 - 确定

  4. 获取ID为654321的广告 - 工作正常,生成的查询为:

    START ad = node adIdid = {0})返回ad参数{0 = 654321}

  5. 使用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}

  6. 之后,使用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}

  7. 但它返回空的org.springframework.data.neo4j.conversion.QueryResultBuilder实例(我正在尝试使用迭代器获取元素)而不是使用Ad 123456的Iterable集合。 我已经尝试了几乎所有我能想到的东西,没有任何成功,我错过了一些重要的东西吗?

    版本:

    • spring-data-neo4j 2.3.3.RELEASE
    • neo4j-cypher-dsl 1.8
    • spring stuff 3.1.4.RELEASE
    • spring-data-neo4j-aspects 2.3.2.RELEASE

1 个答案:

答案 0 :(得分:0)

我认为你在数字索引问题中运行,这对cypher不起作用。由于lucene解析器的问题。

如果您使用

@Indexed(indexName = "adId", unique = true, numeric=false)
private Long id;

它应该有用。

或者您必须传递ValueContext.numeric(id)而不是Long id作为方法的参数。

对于派生的查找程序,我们会自动处理,但对于用户定义的查询,我们无法知道您实际传入的内容。

相关问题