使用聚合函数和数学运算的复杂Cypher查询

时间:2015-03-30 00:21:39

标签: neo4j cypher formula

我正在使用一个Neo4j嵌入式数据库,使用Java API和Cypher查询,使用这样的节点和关系模型:

MATCH (t:Task)-[:ASIGNED_TO]->(p:Person)

现在,以下字段为每种节点的属性:

Task (id, estimated_time,closed, priority, evaluation, start_date, end_date)
Person(id,name)

使用此公式:

A = 3*count(B)+2*count(C)+count(D)

其中B是优先级为“高”的任务,C:“中”,D:“低”。我想要一个计算人的因子的查询(这是使用WHERE子句指定其id)。总结:获取人员的任务,知道哪些人具有自定义优先级,并使用前一个表达式计算A.当然,我尝试过这样的一些查询:

MATCH (p:Person{id: 178})  //with the person with id 178
WITH p
MATCH (t1:Task)-[:ASIGNED_TO]->p
WHERE t1.priority = 'High'
WITH p, count(t1) as B
MATCH (t2:Task)-[:ASIGNED_TO]->p
WHERE t2.priority = 'Medium'
WITH p, B, count(t2) as C
MATCH (t3:Task)-[:ASIGNED_TO]->p
WHERE t3.priority = 'Low'
WITH p,B,C,count(t3) as D
RETURN p.id, (3*B+2*C+D)

这会返回0行,但如果我只是尝试

MATCH (p:Person{id: 178})
WITH p
MATCH (t1:Task)-[:ASIGNED_TO]->p
WHERE t1.priority = 'High'
WITH p, count(t1) as B
RETURN p.id, B

它正确返回有21个具有高优先级的任务。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

拥有178个任务的人员是否具有所有类型的优先级?如果没有,试试这个:

  

MATCH(p:Person {id:178})
  与p
  可选匹配(t1:任务) - [:ASIGNED_TO] - > p
  在哪里t1.priority ='高' WITH   p,计数(t1)为B
  可选匹配(t2:任务) - [:ASIGNED_TO] - > p
  在哪里t2.priority ='中等'
  用p,B,count(t2)作为C
  可选比赛(t3:任务) - [:ASIGNED_TO] - > p
  在哪里t3.priority ='低'
  用p,B,C,计数(t3)作为D
  返回p.id,(3 * B + 2 * C + D)

其他选项:尝试使用PROFILE命令获取有关Cypher查询执行的更多信息。 (link