我有一个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'属性之间的差异所以我知道变化的频率如何?
另外,我如何计算特定“差异”值的百分位数?
尝试找到在大图中应用此功能的最快方法。
提前致谢!
答案 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
该集合并使用min
和max
聚合函数:
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的聚合部分。