Neo4j Cypher:在链表中查找第一个匹配关系?

Neo4j Cypher:在链表中查找第一个匹配关系?,neo4j,cypher,Neo4j,Cypher,正如问题所说。“第一”这个词很重要——可能有更多的关系符合相同的条件 真实世界用例:每个关系都有一个时间戳属性,我想找到在某个时间之前发生的第一个关系(例如“中午之前”)。例如: - 以下是我所拥有的(假设我们知道head节点是什么): 这是查询列表中的第五个关系 您将看到Neo4j拒绝执行查询。如果您将0..更改为例如0..10,它将工作。继续往上跳10下,你会看到它越来越慢。防护装置通过100启动,尝试以下方法: MATCH (x)-[r:next]->(y) WHERE r.tim

正如问题所说。“第一”这个词很重要——可能有更多的关系符合相同的条件

真实世界用例:每个关系都有一个时间戳属性,我想找到在某个时间之前发生的第一个关系(例如“中午之前”)。例如:

-

以下是我所拥有的(假设我们知道
head
节点是什么):

这是查询列表中的第五个关系

您将看到Neo4j拒绝执行查询。如果您将
0..
更改为例如
0..10
,它将工作。继续往上跳10下,你会看到它越来越慢。防护装置通过
100

启动,尝试以下方法:

MATCH (x)-[r:next]->(y) 
WHERE r.time > {time} 
RETURN x, r, y
ORDER BY r.time
LIMIT 1
编辑

如果您的关系在时间属性上建立了索引,那么

START r=relationship:rels(time = {time})
MATCH (x)-[r1:next]->(y)-[r]->()
RETURN x,r1,y

这是2.1之前的cypher的一个缺点(有望解决这个问题)

如果是紧急情况,请查看一个非托管扩展,它在java的几行代码中执行此操作:


我相信去年在Neo4j 3.0.3中已经解决了这一问题,正如在本次提交中所看到的-

没有告诉Neo4j利用链接列表。在我共享的控制台示例中,这将检查所有1000个关系,并在内存中对995个关系进行排序。检查我编辑的答案。我已经使用关系索引来确定您想要的时间,假设您输入的所有时间值都是整数。谢谢,但前提是我知道我要查找的确切时间。在这种情况下,我没有。我只想要一个“中午前”,可能没有发生在中午的关系。我会在GITHUB问题中报告这一点,所以它会被DEV团队跟踪——如果他们不认为它是一个bug,至少作为一个特征请求。这是否在后来的CyfER版本中得到解决?
MATCH (head:Node {id: 0}) -[prevs:next*0..]-> (x) -[rel:next]-> (y)
WHERE NONE(prev IN prevs WHERE prev.time > 5)
AND rel.time > 5
RETURN x, rel, y
MATCH (x)-[r:next]->(y) 
WHERE r.time > {time} 
RETURN x, r, y
ORDER BY r.time
LIMIT 1
START r=relationship:rels(time = {time})
MATCH (x)-[r1:next]->(y)-[r]->()
RETURN x,r1,y