代码之家  ›  专栏  ›  技术社区  ›  Mạnh Quyết Nguyễn

Cypher可变长度模式

  •  0
  • Mạnh Quyết Nguyễn  · 技术社区  · 6 年前

    我把时间线建模成这样:

    (t: Timeline) - [:PREV] -> (t1: Timeline) - [:PREV] -> (t2: Timeline)
    

    每个 Timeline 节点有一个名为 timestamp .

    我的时间事件来自RabbitMQ,没有指定顺序(因为所有服务都使用async推送到队列),所以当新的时间事件出现时,我需要在正确的位置插入一个新的时间节点来维护我的时间轴顺序。

    插入新的 时间线 节点到时间线,我使用以下查询遍历列表:( headTimestamp 是最新的时间节点)

    MATCH (t: Timeline {timestamp: headTimestamp}) - [:PREV*] -> (t1: Timeline)
    WHERE t1.timestamp < newTimestamp
    RETURN t1
    

    我没有办法在第一场比赛中破门。当前它返回所有节点 timestamp < newTimestamp

    我该怎么做,还是有办法解决这个问题?

    1 回复  |  直到 6 年前
        1
  •  1
  •   InverseFalcon    6 年前

    你也许可以使用 LIMIT 1 要获得第一场比赛:

    MATCH (t: Timeline {timestamp: headTimestamp}) - [:PREV*] -> (t1: Timeline)
    WHERE t1.timestamp < newTimestamp
    WITH t1 LIMIT 1
    RETURN t1
    

    您可能需要测试以确保返回第一次命中,因为通常不会定义结果的排序,除非您使用ORDER BY,例如:

    MATCH path = (t: Timeline {timestamp: headTimestamp}) - [:PREV*] -> (t1: Timeline)
    WHERE t1.timestamp < newTimestamp
    WITH t1 
    ORDER BY length(path) ASC
    LIMIT 1
    RETURN t1