为什么Cypher查询在平均函数中返回空值?

时间:2015-03-27 09:40:31

标签: java neo4j cypher

我正在使用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类时,它不会加载聚合函数的值。

任何想法??

2 个答案:

答案 0 :(得分:2)

也许你的数据库中有一个没有estimated_time属性的节点?

尝试返回tt.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,这是空的。