就像问题说的那样。“第一”一词很重要-可能有更多符合相同条件的关系。
实际的用例:每个关系都有一个timestamp属性,我想找到在某个时间之前(例如“中午之前”)发生的第一个关系。例如:
(head) -[time: 9]-> () -[time: 8]-> () -[time: 7]-> ...
Run Code Online (Sandbox Code Playgroud)
-
这就是我所拥有的(假设我们知道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
Run Code Online (Sandbox Code Playgroud)
就是说,“遍历一个或多个关系,直到我们找到一个之前{time}的关系,并且之前的关系都不是之前的{time}。”
该查询有效,但令人惊讶的是,即使找到一个匹配项,它仍继续遍历该列表。更准确地说,它会不断扩展可变长度匹配-即使其他NONE()检查显然会失败。
也许这只是尚未进行的Cypher优化?同时,是否有更有效的方法可以查询此信息?(爱荷华州,有什么办法可以在第一次比赛后实现“短路”吗?)
-
这是一个控制台链接,可用于:
http://console.neo4j.org/r/b4v2tl
重要说明:该安装程序将创建一个1001节点链接列表,因此它可能会冻结您的浏览器/选项卡一分钟左右。我建议解冻时立即禁用“ Toggle Viz”。
为了简单起见,该控制台示例还颠倒了上面示例中的时间顺序。因此,将此查询粘贴到:
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
Run Code Online (Sandbox Code Playgroud)
这就是在查询列表中的第五个关系。
您会看到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
Run Code Online (Sandbox Code Playgroud)
编辑
如果您的关系按时间属性编入索引,那么
START r=relationship:rels(time = {time})
MATCH (x)-[r1:next]->(y)-[r]->()
RETURN x,r1,y
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1212 次 |
| 最近记录: |