Neo4j中第二低的财产价值

Neo4j中第二低的财产价值,neo4j,cypher,Neo4j,Cypher,我有一个Neo4j数据库,我需要找到第二个最低的时间值,这是关系的属性之一。有人能帮我找到第二个最低值吗min()函数可用于查找最小值,但我对如何查找第二个最小值感到困惑 编辑1: 我附上下面图表的快照 另外,我给出了从下图中获取的链接数据 我在这里试图做的是在执行“TT”操作之后获取此特定“msisdn”执行的下一个操作。请在下面查找相同的查询 查询: MATCH (n)-[r]->(k) where r.ActionType='TT' and n.msisdn='258846417

我有一个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”执行的所有操作。请帮助我根据“动作时间”找到下一个动作

Edit2:附加5 msisdn的图形数据(实际上有数千个)。我想找到所有msisdn在'TT'的最小ActionTime之后的下一个动作(关系)。

如果我完全理解您的问题,您可以使用如下查询获得关系中属性的第二个最低值:

MATCH (:Node)-[r:REL_TYPE]->()
WITH r ORDER BY r.property
RETURN collect(distinct r.property)[1] AS secondLowestValue
基本上,我是按照
r.property
的升序对
r
关系进行排序。然后我将有序属性值存储在数组中,并返回第二个元素。即:返回第二个最低值

作为第二种选择,您可以使用,并实现相同的结果(感谢@stdob--)


我在一个包含12个节点和6个关系的小数据集中测试了这两种解决方案。显示第一个解决方案执行47 db提示,而第二个解决方案执行37 db提示。也就是说:考虑到这个简单的指标,第二个解决方案对这个数据集的性能最好。

不确定您到底想要什么,但是这个查询应该按照
ActionTime
的顺序返回指定的
msisdn
,一个
传出的
集合,包含关于其
ActionTime
值大于最小
TT
ActionTime
值的接下来5个关系的信息:

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
值的集合作为密码传递,而不是每次对其进行harcoding。

下面的查询完全回答了我的问题

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;

如果有多个节点具有相同的最小值,您想要该最小值(因为第二个最低的节点具有相同的值),还是想要下一个最低的不同值?我认为排序、限制和跳过更有效。@stdob--我同意。我已经更新了答案,看一看。我在100个节点和10000个关系上比较了这两个查询:40201 db提示(collect)和20201 db提示(skip/limit)。但您的第一个查询变体适用于需要在嵌套查询中找到所需值的情况(例如,在展开中),并且当跳过/限制被截断整个查询时,@Bruno编辑了我的问题,我的问题没有得到解决,我认为如果我能够找到第二个最低时间,然后在我的查询中,我将放置rout.ActionTime=SecondLowestTime。请指导我哪里出错,或者我应该如何修改我的查询查询:匹配(n)-[r]->(k)其中r.ActionType='TT'和n.msisdn='258846417980',n,min(r.ActionTime)为min,r按r.ActionTime排序,收集(不同的r.ActionTime)[1]在第二低匹配(n)-[r]->(k)中r.ActionTime=min和r.ActionType='TT'匹配(n)-[rout]>()其中rout.ActionTime=secondlower,其中n,collect(不同的{relationship:type(rout),node:endNode(rout),rType:rout.ActionType,rTime:rout.ActionTime,rChannel:rout.ContactChannel})作为输出返回{node:n,outing:outing}作为结果限制5;我真正需要的是在“TT”的最小动作时间之后发生的动作中的下一个动作。我不想要接下来的5个动作。你能帮我找到min-TT ActionTime之后发生的下一个动作(关系)吗?谢谢,它适用于单个msisdn。在我的实际数据集中,有数千个这样的msisdn,我想为他们获得下一个关系。你能指导我如何做到这一点吗。如果我最后使用Limit 1,结果中只会出现一个msisdn。请同时查看我编辑的问题和修改的图形数据。知道如何使多个msisdn发生这种情况吗?我不能将msisdn(节点)作为参数传递。所有节点都已在neo4j数据库中创建,我需要在数据库中现有的所有节点上运行此查询。我尝试了下面的查询,但这也返回了单个msisdn
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;