0

我通过findAllByQuery()存储库方法访问全文索引,它工作正常,但我无法传递分页参数,所以我正在尝试可以使用LIMIT的 Cypher 查询,以下是我的测试:

案例 1 -工作正常但硬编码

@Query( "START n=node:searchName('name:*test*') return n" )
EndResult<SomeGraphObject> findByName()

案例 2(从不工作),给出term = "*test*",抛出异常

@Query( "START n=node:searchName('name:{0}') return n" )
EndResult<SomeGraphObject> findByName(String term)

案例 3(部分工作) - 给luceneExpression = "name:*test*"时工作正常,但给luceneExpression = "name:*test test*"时不起作用,我的意思是当查询字符串包含空格时不起作用.

@Query( "START n=node:searchName({0}) return n" )
EndResult<SomeGraphObject> findByName(String luceneExpression)

另一个问题是当我使用findAllByQuery() 存储库方法时,索引searchName将在第一次创建或查询时创建。但是当我使用 Cypher 查询而不创建索引searchName时,它​​会抛出“索引searchName不存在”错误。

任何帮助将不胜感激。

SomeGraphObject.java

@NodeEntity
public class SomeGraphObject {

    @GraphId Long id;

    @Indexed(indexName="searchName", indexType = IndexType.FULLTEXT)
    String name;

}
4

1 回答 1

0

对于动态查询表达式,您应该只使用 case 3 代码。空间不工作的原因是因为在 Lucene 中空间意味着另一个表达式,但出于某种原因,neo4j 要求在任何表达式前面的字段名称意味着您应该使用:
name:*test name:test*
name:(*test test*)

顺便说一句,我认为以 '*' 开头的查询在 Lucene 中是非法的,所以它的工作原理有点奇怪。

于 2014-04-02T12:40:12.843 回答