如何计算属性与百分位数之间的差异?

时间:2016-12-07 00:17:36

标签: neo4j cypher

我有一个neo4j图表,我将其建模为:

MERGE (c1:ChangeTime {at:1800})
MERGE (c2:ChangeTime {at:1900})
MERGE (c3:ChangeTime {at:2200})
MERGE (p:Profile {name:"ME"})
MERGE (p)-[:UPDATED_ON]->(c1)
MERGE (p)-[:UPDATED_ON]->(c2)
MERGE (p)-[:UPDATED_ON]->(c3)

这基本上是个人简介的简化视图,可在不同的更改时间更新。

什么是密码查询来获取每个ChangeTime的'at'属性之间的差异所以我知道变化的频率如何?

另外,我如何计算特定“差异”值的百分位数?

尝试找到在大图中应用此功能的最快方法。

提前致谢!

2 个答案:

答案 0 :(得分:2)

  

什么是Cypher查询,以便在每个ChangeTime'之间找到差异。财产,所以我知道变化的频率如何?

如果你必须坚持普通Cypher,你可以使用list comprehension

MATCH (p:Profile)-[:UPDATED_ON]->(ct:ChangeTime)
WITH p, ct
ORDER BY ct.at
WITH p, collect(ct.at) AS ct_ats
RETURN p, [i IN range(0, length(ct_ats)-2) | ct_ats[i+1] - ct_ats[i]] AS diffs

返回:

╒══════════╤══════════╕
│p         │diffs     │
╞══════════╪══════════╡
│{name: ME}│[100, 300]│
└──────────┴──────────┘

要确定差异值的最小值和最大值,您必须UNWIND该集合并使用minmax聚合函数:

MATCH (p:Profile)-[:UPDATED_ON]->(ct:ChangeTime)
WITH p, ct
ORDER BY ct.at
WITH p, collect(ct.at) AS ct_ats
WITH p, [i IN range(0, length(ct_ats)-2) | ct_ats[i+1] - ct_ats[i]] AS diffs
UNWIND diffs AS diff
RETURN p, min(diff) AS minDiff, max(diff) AS maxDiff

这给出了:

╒══════════╤═══════╤═══════╕
│p         │minDiff│maxDiff│
╞══════════╪═══════╪═══════╡
│{name: ME}│100    │300    │
└──────────┴───────┴───────┘

答案 1 :(得分:1)

我认为您会发现APOC程序很有帮助,尤其是collection functions。特别是apoc.coll.pairsMin(),它接受一个集合参数并返回一对对的集合(因此[1,2,3,4,5]的输入将返回[[1,2],[2,3] ,[3,4],[4,5])。

因此,使用此方法获取特定用户的更改间隔的方法是这样的:

MATCH (:Profile {name:"ME"})-[:UPDATED_ON]->(c:ChangeTime)
WITH c
ORDER BY c.at DESC
WITH COLLECT(c) as updates
CALL apoc.coll.pairsMin(updates) YIELD value
UNWIND value as updatePairs
WITH updatePairs[0] as update1, updatePairs[1] as update2
SET update1.interval = update1.at - update2.at

现在您有了间隔,您可以匹配用户的:ChangeTime节点,并在需要时获得avg()的平均间隔。

至于百分位数,有离散和连续百分位数的聚合函数,请参阅Cypher ref card的聚合部分。