如何将集合参数传递给Neo4J的存储库查询

时间:2016-12-29 09:05:53

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

使用Spring Data for Neo4J我想将一个集合作为参数传递给存储库查询:

@Query("MATCH (product:Product) WHERE ANY(c IN product.categories WHERE c IN {categories}) RETURN product")
Iterable<Product> findAllWithCategories(@Param("categories") List<String> categories);

在命令行上,相应的查询成功运行并提供正确的结果:

MATCH (product:Product) WHERE ANY(c IN product.categories WHERE c IN ["Märklin","Fleischmann"]) RETURN product

但是,当使用类别列表调用 findAllWithCategories 方法时,从Java中不会返回任何结果。奇怪的是,看起来正确的http请求被发送到DB:

request: {"statements":[{"statement":"MATCH (product:Product) WHERE ANY(c IN product.categories WHERE c IN {categories}) RETURN product","parameters":{"categories":["Märklin","Fleischmann"]},"resultDataContents":["graph"],"includeStats":false}]}

知道这里出了什么问题吗?一般来说,如何将集合作为参数传递给Neo4J的存储库查询?

修改 相同的查询在没有Spring Data存储库的情况下运行,但是使用更低级别的Neo4JTemplate会得到相同的结果,这非常奇怪,因为命令行上的Query执行它应该做的事情。

private final String FIND_PRODUCTS_WITH_CATEGORIES = "MATCH (product:Product) WHERE ANY(c IN product.categories WHERE c IN {categories}) RETURN product";

String[] categories = ...

Map<String, Object> map = new HashedMap<>();
map.put("categories", categories);
products = neo4j.queryForObjects(Product.class, FIND_PRODUCTS_WITH_CATEGORIES, map);

我不认为查询语句有任何问题,而是使用列表类型的参数。

修改 半天后我尝试了螺栓驱动程序,而不是http驱动程序,一切都还可以(使用驱动程序的2.0.6版本,2.1.0版抛出一个奇怪的例外)

1 个答案:

答案 0 :(得分:0)

查询没问题。将数组或列表作为参数切换到查询工作。问题是驱动程序:使用http驱动程序没有成功,螺栓驱动程序似乎在最新版本2.1.0中出错。但是使用bolt 2.0.6,我开始运行了。