为什么 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,例如 ExtendedExecutionResult
和 org.neo4j.cypher package
中的 ExecutionResult
,还有 returns 相同的输出。问题不在于查询,它工作得很好所以我认为是在使用 Cypher classes 时,它不会加载聚合函数的值。
有什么想法吗??
也许您的数据库中有一个没有 estimated_time
属性 的节点?
尝试returnt
或t.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,这是空的。
我正在使用 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,例如 ExtendedExecutionResult
和 org.neo4j.cypher package
中的 ExecutionResult
,还有 returns 相同的输出。问题不在于查询,它工作得很好所以我认为是在使用 Cypher classes 时,它不会加载聚合函数的值。
有什么想法吗??
也许您的数据库中有一个没有 estimated_time
属性 的节点?
尝试returnt
或t.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,这是空的。