【发布时间】:2015-05-31 14:13:47
【问题描述】:
我正在使用 Neo4j (2.2.0 M2) 嵌入式图形应用程序。为了查询这个图,我使用 Cypher 方式,使用 GraphDatabaseService 类及其方法execute(query, params),它返回一个org.neo4j.graphdb.Result 实例。问题是当我在查询中使用聚合函数(avg)时:
MATCH
(e:Person {person_id: {id} }) <-[:ASIGNED_TO]-(t:Task)
WHERE t.start_date >= {cuttof_date}
RETURN AVG(t.estimated_time) as avgte
为了简要了解这个查询:id 和 cuttof_date 是我放在 Mapset 中的参数,其中最后一个是 UTC(长)日期并且可比较。 这个查询的结果,使用 Neo4j 浏览器管理器,并给指定的参数一些值,如下:
平均
6.166666666666667
在 665 毫秒内返回 1 行。
完美!现在,当我期望在 Java 代码中使用 Cypher 得到相同的结果时(我避免了“尝试”和“使用资源”):
//Same params
int id = 187;
long longDate = 1357016400000L;
Map<String,Object> params= new HashMap<>();
params.put("id", id);
params.put("cuttof_date", longDate);
//same query
String query = "MATCH"+
"(e:Person {person_id: {id} }) <-[:ASIGNED_TO]-(t:Task) " +
"WHERE t.start_date >= {cuttof_date} " +
"RETURN AVG(t.estimated_time) as avgte";
GraphDatabaseService gdbs = new
GraphDatabaseFactory().
newEmbeddedDatabase(DB_NAME) ;
Result result = gdbs.execute(query, params);
Map<String, Object> firstRow = result.next();
Object avgteObject = firstRow.get("avgte");
//Using the most basic transformation: as String
System.out.println("AVGTE: "+String.valueOf(avgteObject));
结果是:“AVGTE: null”。这怎么可能!?我还使用了其他类,如ExtendedExecutionResult 和ExecutionResult 中的ExecutionResult,但也返回相同的输出。问题不在于查询,它运行良好,所以我认为是在使用 Cypher 类时,它不会加载聚合函数的值。
有什么想法吗??
【问题讨论】:
-
您确定 DB_NAME 正确指向您的数据库吗?如果数据库文件夹不存在,neo4j 将默默地创建空数据库,因此您的结果为空。
-
是的,数据库配置一切正常。 DB_NAME var 包含具有指定数据库位置的正确字符串。此外,使用相同的代码我执行了另一个查询,并且它们工作。
-
感谢@frant.hartm,这就是问题所在,创建了一个空数据库。