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