我有一个Neo4j数据库,我需要找到时间的第二低值,这是关系属性之一。任何人都可以帮助我找到第二低的价值。 min()
函数可用于查找最小值,但我对如何找到第二低值感到困惑。
编辑1: 我附上下图的快照
此外,我正在从下图中提取链接数据。
我在这里尝试做的是在执行'TT'动作后获取此特定'msisdn'所做的下一个动作。请在下面找到相同的查询。
查询:
MATCH (n)-[r]->(k) where r.ActionType='TT' and n.msisdn='258846417980'
with n,min(r.ActionTime) as min
MATCH (n)-[r]->(k)
where r.ActionTime=min and r.ActionType='TT'
MATCH (n)-[rout]->() where rout.ActionTime>min
WITH n,collect( distinct
{ relationship:type(rout),
node: endNode(rout), rType: rout.ActionType, rTime: rout.ActionTime, rChannel: rout.ContactChannel
}) AS outgoing
RETURN { node: n, outgoing: outgoing } AS result limit 5;
上述查询将在执行“TT”操作后给出特定“msisdn”所做的所有操作。请帮我找到基于'ActionTime'的下一个动作
Edit2:为5 msisdn附加图表数据(实际上有数千个)。我想在'TT'的最小动作时间之后找到所有msisdn的下一个动作(关系)。 Graph Data Modified
答案 0 :(得分:1)
如果我完全理解你的问题,你可以使用如下的查询来获得关系中属性的第二低值:
MATCH (:Node)-[r:REL_TYPE]->()
WITH r ORDER BY r.property
RETURN collect(distinct r.property)[1] AS secondLowestValue
基本上我按r
按升序排序r.property
关系。然后我将有序属性值存储在一个数组中并返回第二个元素。那就是:返回第二个最低值。
作为第二种选择,您可以使用ORDER BY,SKIP和LIMIT来获得相同的结果(感谢@ stdob--)。
MATCH (:Node)-[r:REL_TYPE]->()
WITH distinct r.property as property ORDER BY r.property SKIP 1 LIMIT 1
RETURN property
我在一个包含12个节点和6个关系的小型数据集中测试了这两种解决方案。 PROFILE表示第一个解决方案执行47个db提示,而de second解决方案执行37个db提示。也就是说:考虑到这个简单的度量标准,第二个解决方案对此数据集具有最佳性能。
答案 1 :(得分:0)
不确定您确切想要什么,但此查询应以msisdn
顺序返回指定的ActionTime
,outgoing
集合,其中包含有关{{1}的后续5个关系的信息}}值大于最小ActionTime
TT
值:
ActionTime
[编辑4次]
获取有关五个MATCH (n)-[r]->(k) WHERE r.ActionType='TT' AND n.msisdn='258846417980'
with n, MIN(r.ActionTime) as min
MATCH (n)-[rout]->() WHERE rout.ActionTime > min
WITH n, rout
ORDER BY rout.ActionTime
LIMIT 5
RETURN {
node: n,
outgoing: COLLECT(
{ relationship: TYPE(rout),
node: ENDNODE(rout),
rType: rout.ActionType,
rTime: rout.ActionTime,
rChannel: rout.ContactChannel
})
} AS result;
值的节点的下一个关系的信息,并获取与每个节点关联的唯一msisdn
:
ActionTypes
提示:您实际上应该将MATCH (n) WHERE n.msisdn IN ['1', '2', '3', '4', '5']
MATCH (n)-[r]->(k) WHERE r.ActionType='TT'
WITH n, MIN(r.ActionTime) as min
MATCH (n)-[rout]->() WHERE rout.ActionTime > min
WITH n, rout
ORDER BY rout.ActionTime
WITH n, COLLECT(rout) AS rs
WITH n, rs[0] AS r,
REDUCE(s = [], x IN rs |
CASE WHEN x.ActionType IN s THEN s ELSE s + x.ActionType END) AS types
RETURN {
node: n,
outgoing: {
relationship: TYPE(r),
node: ENDNODE(r),
rType: r.ActionType,
rTime: r.ActionTime,
rChannel: r.ContactChannel
},
actionTypes: types
} AS result;
值的集合作为parameter传递,而不是每次都将其编码。
答案 2 :(得分:0)
以下查询完全回答了我的问题。
MATCH (n) with n, collect(n.msisdn) as list
Match (n) WHERE n.msisdn IN list
MATCH (n)-[r]->(k) WHERE r.ActionType='TT'
WITH n, MIN(r.ActionTime) as min
MATCH (n)-[rout]->() WHERE rout.ActionTime > min
WITH n, rout
ORDER BY rout.ActionTime
WITH n, COLLECT(rout)[0] AS r
RETURN {
node: n,
outgoing:
{ relationship: TYPE(r),
node: ENDNODE(r),
rType: r.ActionType,
rTime: r.ActionTime,
rChannel: r.ContactChannel
}
} AS result;