使用复合查询的Neo4J-SpringData-@query

使用复合查询的Neo4J-SpringData-@query,neo4j,spring-data,spring-data-neo4j,Neo4j,Spring Data,Spring Data Neo4j,我对Neo4J有点陌生:我使用SpringData构建了一个使用Neo4J的应用程序。 我有一个@NodeEntity,其中包含“name”和“year”属性,由于通常使用按名称和年份进行搜索,我在这两个字段上定义了一个复合索引: @Getter @Setter @NoArgsConstructor @ToString(of = { "name", "year" }) public abstract class BaseContent<D extends BaseContentDTO>

我对Neo4J有点陌生:我使用SpringData构建了一个使用Neo4J的应用程序。 我有一个@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;
}
我得到的错误是:

org.apache.cxf.interceptor.Fault: null at
BadInputException
我不明白我做错了什么。 我尝试过不同的变体,比如使用{0}和{1}而不是参数名,但这也没有帮助

顺便说一下,这是Cypher查询,在web管理员中运行良好:

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
java.lang.RuntimeException:org.apache.cxf.interceptor.Fault:org.apache.lucene.queryParser.ParseException:无法分析“名称:{name}和年份:{year}”:在第1行第10列遇到“}”。
我期待的是:
“到”。。。
...
...
在
我非常感谢你的帮助


Carmel

尝试将实际查询的查找带到外面()。我的意思是,在括号内,您需要明确提到某个值,cypher将注意该值。
@Query(“开始电影=节点:搜索内容(name='Matrix'),其中movie.year={year}返回电影)


这将根据索引search\u content和一个属性
name='Matrix'
搜索所有节点,但它可能有其他值,如
className='org.abc.Movie'
或类似的值。

您是否尝试过:
@Query(“开始电影=节点:搜索\u content(name={name}和year={year}”)返回movie.name,movie.year)
?我的意思是没有任何
\”
我有。这是它抛出的异常:java.lang.RuntimeException:org.apache.cxf.interceptor.Fault:Unclosed括号“start movie=node:search\u content(name={name}和year={year})返回电影;“^at syntaxException我实际上对查询结构有疑问。你为什么不在
()
的外面进行实际的查询查找。我的意思是在括号内,你需要明确提到某个值,cypher将在该值上查找。
@query(“开始电影=节点:搜索内容(name='Matrix'))其中movie.year={year}return movie)
这将根据索引
search\u content
和一个属性
name='Matrix'
搜索所有节点。我不确定这一点,但试一下。基本上,
()
的应用范围比给定的索引更广。在上面的评论中,我明确地提到了它的名称class='Matrix',但它可以有其他值,比如className='org.abc.Movie'或类似的值。最后一个值有效。谢谢(尽管我仍然不知道为什么在管理员上工作的密码查询在SpringData上不工作)。再次感谢:)
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