为什么 Cypher 在 average 函数中查询 returns 一个空值?

Why Cypher query returns a null value in average function?

我正在使用 Neo4j (2.2.0 M2) 嵌入式图形应用程序。为了查询此图,我使用 Cypher 方式,使用 GraphDatabaseService class 及其方法 execute(query, params),returns 一个 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 得到相同的结果时(我避免了 "try" 和 "with resources"):

    //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"。这怎么可能!?我还使用了其他 class,例如 ExtendedExecutionResultorg.neo4j.cypher package 中的 ExecutionResult,还有 returns 相同的输出。问题不在于查询,它工作得很好所以我认为是在使用 Cypher classes 时,它不会加载聚合函数的值。

有什么想法吗??

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

尝试returntt.estimated_time查看原始数据

我的错误:创建一个空数据库。片段代码:DB_NAME 采用以下值:"gespro_graph_db"

GraphDatabaseService gdbs = new 
                GraphDatabaseFactory().
                newEmbeddedDatabase(DB_NAME) ;

如果图形数据库位置在同一项目路径中,它会起作用,但它的文件夹结构如下:/project_path/gespro_graph/gespro_graph_db/,其中最后一个文件夹是实际位置。我的项目指向 /project_path/gespro_graph_db,这是空的。