2016-12-07 94 views
2

我有已建模爲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的「在」屬性的差異,所以我知道這個變化的頻率如何?

而且還我怎麼計算具體的「差」值百分?

試圖找到在大圖中應用此方法的最快方法。

在此先感謝!

+0

通過「如何變化的頻率」,你實際上意味着「變化率」? – cybersam

回答

2

What is the Cypher query to get the difference between each ChangeTime's 'at' property so I know how frequency of the change?

如果你要堅持平原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]│ 
└──────────┴──────────┘ 

來確定最小和最大的DIFF值,你必須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 │ 
└──────────┴───────┴───────┘ 
+0

感謝您的答覆。我複製並粘貼查詢,但它只返回/可視化顯示一個節點的p,但不包含表如果我只想得到所有th剖面/ p的最小差異和最大差異,那該怎麼辦? – user716222

+0

@ user716222來獲取表格,只需選擇「文本」輸出(從圖形,行,文本和代碼選項,左邊的結果)。 –

+0

@ user716222我用查詢更新了答案,以給出最小和最大的差異。 –

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的聚合部。

+0

查詢返回一個錯誤: 無效的輸入「[」:「」預期的標識符字符,節點的標籤,一個特性圖,空格的關係模式,「(」,‘=’或‘+ =’(第7行,第16列(偏移量:200)) 「SET updatePairs [0] .interval = updatePairs [0] .at - updatePairs [1] .at」 ^ – user716222

+0

Cypher可以挑剔地設置集合元素的值。我更新了查詢來爲別名的每個部分別名,看看是否修復它。 – InverseFalcon

相關問題