使用neo4j将集合作为参数传递

时间:2014-03-08 02:11:45

标签: neo4j cypher

我一直在使用参数来查询节点索引(使用java中的rest api) -

final QueryResult<Map<String,Object>> result = engine.query("start nd=node:name_index(name={src}) return nd.age as age", MapUtil.map("src", "Susan");

但是我无法让这个用于节点/名称的集合。我一直在努力尝试 -

final QueryResult<Map<String,Object>> result = engine.query("start nd=node:name_index(name={src}) return nd.age as age", MapUtil.map("src", Arrays.asList("Susan","Brian", "Ian"));

但它拒绝编译。我想知道我的语法是否有问题,或者参数不适合在此上下文中工作。

2 个答案:

答案 0 :(得分:1)

开头的name=语法用于对属性执行索引查找。它不会进行IN查找。你可以做这种查找的方式是这样的(注意它取决于Apache的StringUtils):

List<String> names = Arrays.asList("Susan","Brian", "Ian");
String luceneQuery = "name:("+StringUtils.join(names, ",")+")";
engine.query("start nd=node:name_index({luceneQuery}) return nd.age as age", MapUtil.map("luceneQuery", luceneQuery));

请注意,这是“传统”索引的做事方式。在2.0中,他们引入了基于标签的索引,这些索引完全不同。

答案 1 :(得分:0)

非常感谢;虽然当我在第2行的逗号之后添加一个空格时它仍然只会返回一个非空的答案。我使用了 -

String luceneQuery =&#34; name:(&#34; + StringUtils.join(names,&#34;,&#34;)+&#34;)&#34 ;;

它返回了一个人的年龄。当我尝试这个时:

String luceneQuery = "fs:(fs:"+ StringUtils.join(names, " OR fs:")+")"; 
它给了我三个年龄段。但是,我仍然不确定此查询是否能够利用参数的通常优势,即引擎是否能够在下次重用查询和执行路径时(这次我们可能想要查询4个名称而不是3)