我是Neo4J的新手:我已经使用SpringData构建了一个使用Neo4j的应用程序。 我有一个包含'name'和'year'属性的@NodeEntity,并且通常使用name和year搜索,我在这两个字段中定义了一个复合索引:
@Getter
@Setter
@NoArgsConstructor
@ToString(of = { "name", "year" })
public abstract class BaseContent<D extends BaseContentDTO> extends BaseEntity {
@Indexed(indexName = "search_content")
protected String name;
@Indexed(indexName = "search_content")
protected Integer year;
}
我正在尝试使用此复合索引按名称和年份查询内容。 此查询适用于Neo4j web-admin,但当我尝试使用SpringData运行它时,它不会。
这是我在SpringData中的查询:
@Query("start movie=node:search_content(\"name={name} AND year={year}\") return movie;")
public T findByNameAndYear(@Param("name") String name, @Param("year") Integer year);
我得到的错误:
org.apache.cxf.interceptor.Fault: null at
BadInputException
我不明白我做错了什么。 我尝试了不同的变体,例如使用{0}和{1}而不是param名称,但这也无济于事。
顺便说一句,这是Cypher查询,在网络管理员中运作良好:
start movie=node:search_content('name:Salt AND year:2010') return movie.name, movie.year;
如果我使用@query':'代替'=',就像这样:
@Query("start movie=node:search_content(\"name:{name} AND year:{year}\") return movie;")
我收到此错误:
java.lang.RuntimeException: org.apache.cxf.interceptor.Fault: org.apache.lucene.queryParser.ParseException: Cannot parse 'name:{name} AND year:{year}': Encountered " "}" "} "" at line 1, column 10.
Was expecting one of:
"TO" ...
<RANGEEX_QUOTED> ...
<RANGEEX_GOOP> ...
at
非常感谢您的帮助,
卡梅尔
答案 0 :(得分:2)
尝试取出你的实际查询()。我的意思是在括号内你需要明确提到一些关于cypher将要注意的值
@Query("start movie=node:search_content(name='Matrix') WHERE movie.year={year} return movie)
这将基于索引 search_content 搜索所有节点,并将一个属性搜索为name='Matrix'
,但它可能具有其他值,如className='org.abc.Movie'
或类似的值。