就像问题所说的那样。 “第一”这个词很重要——可能有更多的关系符合相同的条件。
实际用例:每个关系都有一个时间戳属性,以及 我想找到某个时间之前发生的第一个 (例如“中午之前”)。例如。:
(head) -[time: 9]-> () -[time: 8]-> () -[time: 7]-> ...
—
这是我所拥有的(假设我们知道
head
节点是什么):MATCH (head) -[prevs:next*0..]-> (x) -[rel:next]-> (y)
WHERE NONE(prev IN prevs WHERE prev.time < {time})
AND rel.time < {time}
RETURN x, rel, y
也就是说,“遍历一个或多个关系,直到我们在
{time}
之前找到一个关系,并且之前的关系都不在 {time}
之前。”该查询有效,但令人惊讶的是,即使在找到一个匹配项后,它仍会继续遍历列表 .更准确地说,它不断扩展可变长度匹配——即使
NONE()
其余的检查显然将失败。也许这只是一个尚未到来的 Cypher 优化?同时,有没有更有效的方法可以查询? (IOW,有什么办法可以在第一场比赛后实现“短路”?)
—
这是一个可以玩的控制台链接:
http://console.neo4j.org/r/b4v2tl
重要提示:该设置会创建一个 1001 节点的链表,因此它可能会卡住您的浏览器/选项卡一分钟左右。我建议在解冻时立即禁用“切换可视化”。
为简单起见,此控制台示例还颠倒了上面示例中的时间顺序。因此,将此查询粘贴到:
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
那就是查询列表中的第五个关系应该是什么。
您会看到 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
关于Neo4j 密码 : find first matching relationship in a linked list?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21746893/