Neo4j cypher查询从HPALM测试运行数据中过滤重复数据

时间:2018-04-03 08:09:17

标签: sql neo4j cypher

我将测试实例数据从HPALM拉入Neo4j&然后尝试使用Neo4j Cypher查询在grafana中创建仪表板图形。每次测试运行都会在Neo4j中创建一个新行,并使用相同的" test-id"。所以,如果我进行测试&它昨天失败了&今天通过相同的测试然后有2个条目/行为相同的test-id创建,具有不同的状态=通过/失败&上次修改的不同日期/时间。要创建摘要,我需要查询,该查询将过滤掉重复的测试ID条目,以便显示最新(不同的)上次运行数据以及测试状态,以便总测试计数与HPALM中显示的匹配。下面是查询,它显示了在测试运行的不同日期/时间具有相同ID但不同测试状态的多个行。我需要查询按日期排序&然后消除/过滤第一和第二结果的第3行,因为它是旧的测试运行条目。我只想要第2行和第2行的最新运行条目。 4。 第1行和第1行2有重复" test-id" =' 72534'这需要与众不同。

MATCH (a:HP) 
WHERE a.project='CHP' and a.type='test-instance' and a.`cycle-id` ='11743' 
RETURN distinct a.id, a.`test-id`, a.`exec-date`, a.`last-modified`, 
       a.status, a.name, a.owner 
ORDER BY a.id

╒═════╤═══════════╤═════════════╤═══════════════════╤════════╤══════╤═══════╕
│a.id │a.`test-id`│a.`exec-date`│a.`last-modified`  │a.status│a.name│a.owner│
╞═════╪═══════════╪═════════════╪═══════════════════╪════════╪══════╪═══════╡
│44079│72534      │2018-03-09   │2018-03-09 07:42:30│Failed  │(null)│g942477│
├─────┼───────────┼─────────────┼───────────────────┼────────┼──────┼───────┤
│44079│72534      │2018-03-20   │2018-03-20 13:01:31│Passed  │(null)│g942477│
├─────┼───────────┼─────────────┼───────────────────┼────────┼──────┼───────┤
│44080│72533      │2018-03-07   │2018-03-07 11:12:54│Failed  │(null)│g942477│
├─────┼───────────┼─────────────┼───────────────────┼────────┼──────┼───────┤
│44080│72533      │2018-03-21   │2018-03-21 10:42:11│Passed  │(null)│g942477│
├─────┼───────────┼─────────────┼───────────────────┼────────┼──────┼───────┤
│44081│72532      │2018-03-05   │2018-03-05 11:51:28│Passed  │(null)│g942477│
├─────┼───────────┼─────────────┼───────────────────┼────────┼──────┼───────┤
│44082│72526      │2018-03-05   │2018-03-05 11:56:54│Failed  │(null)│g942477│

最后修改的列的类型为" String" &安培;在过滤重复项之前,我还需要有关如何按日期对条目进行排序的帮助。

目前,由于重复的条目,摘要响应显示高于预期的测试次数计数'失败' ,'没有跑步' &安培; '未完成'作为以下查询的结果:我还需要有关更新查询的帮助,这会提供正确的摘要计数。 (在重复过滤后)

MATCH (a:HP)
WHERE  a.project='CHP'  and a.type='test-instance' and a.`cycle-id`='11743'
RETURN  a.status , count(*) as cnt ,a.`cycle-id`
ORDER BY a.status

╒═════════════╤═══╤════════════╕
│a.status     │cnt│a.`cycle-id`│
╞═════════════╪═══╪════════════╡
│Failed       │4  │11743       │
├─────────────┼───┼────────────┤
│No Run       │2  │11743       │
├─────────────┼───┼────────────┤
│Not Completed│5  │11743       │
├─────────────┼───┼────────────┤
│Passed       │31 │11743       │
└─────────────┴───┴────────────┘

需要样本查询以了解如何使用" Group By" &安培; "具有"在上面我的案例中neo4j中的条款。

我还需要知道[DateCreated-Today(date-time)]的示例查询。如何在字符串类型字段中添加减去日期?

我正在使用Neo4j版本:3.0.6如果您需要更多详细信息,请告诉我。

1 个答案:

答案 0 :(得分:0)

在Neo4j中,当使用聚合函数(例如collect(),count()和sum())时,WITH子句中的非聚合变量将成为隐式分组键。因此,在这种情况下,您需要将测试ID作为非聚合变量,并收集其余的。

为了确保您的收藏品的顺序正确,您需要在收集之前进行排序,然后收集它时只需获得收藏的头部。

WITH子句是这里的关键,因为它是一个可以更改范围内的变量并执行聚合的地方,然后通过其他操作进行跟进。

MATCH (a:HP) 
WHERE a.project='CHP' and a.type='test-instance' and a.`cycle-id` ='11743' 
WITH a.`test-id` as testId, a
ORDER BY a.`exec-date` DESC, a.`last-modified` DESC
WITH testId, head(collect(a)) as a
ORDER BY a.id
RETURN a.id as id, testId, a.`exec-date` as `exec-date`, 
       a.`last-modified` as `last-modified`, a.status as status, 
       a.name as name, a.owner as owner

对于您的摘要查询,我们将采用类似的方法来确保每个执行日期和最后修改时只有最新的a节点,然后才能获得每个状态的计数: / p>

MATCH (a:HP)
WHERE  a.project='CHP'  and a.type='test-instance' and a.`cycle-id`='11743'
WITH a.`test-id` as testId, a
ORDER BY a.`exec-date` DESC, a.`last-modified` DESC
WITH testId, head(collect(a)) as a
RETURN a.status as status, count(a) as cnt, a.`cycle-id` as `cycle-id`
ORDER BY status

现在,所有这些说,你的数据模型对我来说看起来并不是很好。您可能希望确保这非常适合您想要做的事情,因为图形数据库在存在连接数据时表现优异,但是当涉及这些类型的查询时,关系数据库往往优于它们,其中没有关系遍历或者有趣的图形连接来评估。