Neo4j的第二低财产价值

问题描述 投票:0回答:3

我有一个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

neo4j cypher
3个回答
0
投票

不知道你究竟想要什么,但是这个查询应该返回指定的msisdn,以ActionTime顺序,一个outgoing集合,其中包含下一个5个关系的信息,其ActionTime值大于最小TT ActionTime值:

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;

[已编辑4次]

要获得有关五个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;

提示:您实际上应该将msisdn值的集合作为parameter传递,而不是每次都将其编码。


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提示。也就是说:考虑到这个简单的度量标准,第二个解决方案对此数据集具有最佳性能。


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;
© www.soinside.com 2019 - 2024. All rights reserved.