Neo4j的第二低财产价值

时间:2017-12-13 10:20:35

标签: neo4j cypher

我有一个Neo4j数据库,我需要找到时间的第二低值,这是关系属性之一。任何人都可以帮助我找到第二低的价值。 min()函数可用于查找最小值,但我对如何找到第二低值感到困惑。

编辑1: 我附上下图的快照

Graph snap

此外,我正在从下图中提取链接数据。

Graph Data

我在这里尝试做的是在执行'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

3 个答案:

答案 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 BYSKIPLIMIT来获得相同的结果(感谢@ 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顺序返回指定的ActionTimeoutgoing集合,其中包含有关{{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;