Neo4j 密码 : find first matching relationship in a linked list?

标签 neo4j cypher

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

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

(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/

相关文章:

docker - neo4j和.NetCore Docker设置

neo4j - Cypher 加载 CSV 急切且 Action 持续时间长

neo4j 创建具有多个对象的节点

neo4j - 如何将 csv 文件从 hdfs 加载到 neo4j 数据库中?

performance - 为什么这两个看似相同的 Cypher 查询在速度上差异如此之大?

java - Neo4j 密码 MATCH 查询不起作用

Neo4j:查找与列表中所有节点有连接的节点

Neo4j:在匹配和创建时向关系添加属性

neo4j - neo4j.log 的时区设置

neo4j - 在云中托管公共(public)(只读)Neo4j 实例