【问题标题】:Neo4J - SpringData - @query using compound queryNeo4J - SpringData - @query 使用复合查询
【发布时间】:2014-01-13 09:30:02
【问题描述】:

我对 Neo4J 有点陌生:我使用 SpringData 构建了一个使用 Neo4j 的应用程序。 我有一个包含“名称”和“年份”属性的@NodeEntity,并且通常使用按名称和年份进行搜索,我在这两个字段上定义了一个复合索引:

@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 网络管理员中有效,但在我尝试使用 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} 代替参数名称,但这也无济于事。

顺便说一下,这是 Cypher 查询,在 web-admin 中运行良好:

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

非常感谢您的帮助,

卡梅尔

【问题讨论】:

  • 你试过这个:@Query("start movie=node:search_content(name={name} AND year={year}) return movie.name, movie.year) 吗?我的意思是没有任何\"
  • 我有。这是它抛出的异常:java.lang.RuntimeException: org.apache.cxf.interceptor.Fault: Unclosed parenthesis "start movie=node:search_content(name={name} AND year={year}) return movie;" ^ 在语法异常
  • 我实际上对查询结构有疑问。你为什么不拿出你的实际查询在() 之外查找。我的意思是在括号内,您需要明确提及密码会注意的一些值。 @Query("start movie=node:search_content(name='Matrix') WHERE movie.year={year} return movie) 这将根据索引search_content 和一个属性为name='Matrix' 搜索所有节点。我不确定,但请尝试一下。
  • 基本上() 以更广泛的方式应用于给定的索引。在上面的评论中,我已经明确提到它 name='Matrix' 但它可能具有其他值,例如 className='org.abc.Movie' 或类似的东西。
  • 最后一个有效。谢谢(尽管我仍然不明白为什么在管理员上工作的密码查询在 SpringData 上不起作用)。再次感谢:)

标签: neo4j spring-data spring-data-neo4j


【解决方案1】:

尝试从 () 中取出您的实际查询。我的意思是在括号内,您需要明确提及密码将查看的一些值。
@Query("start movie=node:search_content(name='Matrix') WHERE movie.year={year} return movie)
这将根据索引 search_content 和一个属性为 name='Matrix' 搜索所有节点,但它可能具有其他值,例如 className='org.abc.Movie' 或类似的值。

【讨论】:

    猜你喜欢
    • 2018-08-08
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多