我正在使用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浏览器管理器,并为指定的参数提供一些值,如下所示:
avgte
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
的{{1}}和ExecutionResult
等其他类,但也返回了相同的输出。问题不在于Query,它完美运行所以我认为在使用Cypher类时,它不会加载聚合函数的值。
任何想法??
答案 0 :(得分:2)
也许你的数据库中有一个没有estimated_time
属性的节点?
尝试返回t
或t.estimated_time
以查看原始数据
答案 1 :(得分:0)
我的坏:创建一个空的数据库。 snipet代码:DB_NAME采用以下值:“gespro_graph_db”
GraphDatabaseService gdbs = new
GraphDatabaseFactory().
newEmbeddedDatabase(DB_NAME) ;
如果图形数据库位置位于同一个项目路径中,但它的文件夹结构如下所示:/ project_path / gespro_graph / gespro_graph_db /,其中最后一个文件夹是实际位置。我的项目指向/ project_path / gespro_graph_db,这是空的。