【问题标题】:Why Cypher query returns a null value in average function?为什么 Cypher 查询在平均函数中返回空值?
【发布时间】: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”。这怎么可能!?我还使用了其他类,如ExtendedExecutionResultExecutionResult 中的ExecutionResult,但也返回相同的输出。问题不在于查询,它运行良好,所以我认为是在使用 Cypher 类时,它不会加载聚合函数的值。

有什么想法吗??

【问题讨论】:

  • 您确定 DB_NAME 正确指向您的数据库吗?如果数据库文件夹不存在,neo4j 将默默地创建空数据库,因此您的结果为空。
  • 是的,数据库配置一切正常。 DB_NAME var 包含具有指定数据库位置的正确字符串。此外,使用相同的代码我执行了另一个查询,并且它们工作。
  • 感谢@frant.hartm,这就是问题所在,创建了一个空数据库。

标签: java neo4j cypher


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    尝试返回tt.estimated_time查看原始数据

    【讨论】:

    • 迈克尔,首先感谢您的回答,我真的很期待。尝试你的解决方案我发现了一个空的结果集。这并不能解决我的问题,但我发布图形数据库是空的。正如@frant.hartm 所说,创建了一个空数据库,因此响应为空。创建一个新项目,检查每一步,avg函数的结果确实完美!问题:图形数据库的位置不好。我认为 Neo4j 社区必须修复这种数据库创建以防止此问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 2021-11-30
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 2013-05-22
    相关资源
    最近更新 更多