【问题标题】:Spring Data Neo4j repository returning empty collectionSpring Data Neo4j 存储库返回空集合
【发布时间】:2014-03-18 10:56:38
【问题描述】:

我的部分项目使用 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 的广告节点 - ok

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

    开始ad=node:adId(id={0}) 返回ad参数{0=654321}

  5. 使用 findSimilarAds() 获取类似广告,参数是上一步中的广告 - 效果很好,它返回 id 为 123456 的广告,生成查询:

    START ad1=node({adv}) MATCH ad1-[r1:CONTAINS]->Keyword

  6. 之后,使用 findSimilarAdsById() 方法获取类似广告 - id 参数为 654321L。结果查询如下所示:

    START ad1=node:adId(id={p_id}) MATCH ad1-[r1:CONTAINS]->Keyword

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

版本:

  • spring-data-neo4j 2.3.3.RELEASE
  • neo4j-cypher-dsl 1.8
  • 春天的东西 3.1.4.RELEASE
  • spring-data-neo4j-aspects 2.3.2.RELEASE

【问题讨论】:

    标签: neo4j cypher spring-data-neo4j


    【解决方案1】:

    我认为您遇到了数字索引问题,这不适用于 cypher。由于 lucene 解析器的问题。

    如果你使用

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

    它应该可以工作。

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

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

    【讨论】:

    • “numeric=false”的解决方案有效。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 2014-05-31
    • 2022-10-13
    • 2018-01-17
    • 2012-09-17
    • 2020-04-12
    相关资源
    最近更新 更多