【问题标题】:Finding right path in Cypher Neo4j在 Cypher Neo4j 中找到正确的路径
【发布时间】:2020-10-06 14:38:31
【问题描述】:

我正在使用 Flight Analyzer 数据库 (https://neo4j.com/graphgist/flight-analyzer)。 我们的节点和关系类型很少。 节点: 机场

(SEA:Airport { name:'SEA' })

航班

(f0:Flight { date:'11/30/2015 04:24:12', duration:218, distance:1721, airline:'19977' })

门票

(t1f0:Ticket { class:'economy', price:1344.75 })

关系 目的地

(f0)-[:DESTINATION]->(ORD)

原产地

(f0)-[:ORIGIN]->(SEA)

分配

(t1f0)-[:ASSIGN]->(f0)

现在我需要找到一些路径,但我遇到了连接 ORIGIN - FLIGHT - DESTINATION 的问题。 我需要找到与 LAX 机场相连且票价总和

我试过了

MATCH path = (origin:Airport { name:"LAX" })<-[r:ORIGIN|DESTINATION*..5]->(destination:Airport)
WHERE REDUCE(s = 0, n IN [x IN NODES(path) WHERE 'Flight' IN LABELS(x)] |
s + [(n)<-[:ASSIGN]-(ticket) | ticket.price][0]
) < 3000
RETURN path

但在此解决方案中,LAX 也可以是 ORIGIN 和 DESTINATION。我只想选择始终具有相同顺序的路径 aiport1 airport2 aiport etc..

我需要包括出发和到达时间,所以 航班1日期+持续时间

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    [更新]

    这个查询应该检查:

    • 匹配的路径具有交替的ORIGIN/DESTINATION 关系,并且
    • 每个出发航班至少在下一个出发航班(如果有)前 30 分钟降落,并且
    • Flight 节点的票价总和(从第二个节点开始每隔一个节点)
    MATCH p = (origin:Airport {name: 'LAX'})-[:ORIGIN|DESTINATION*..5]-(destination:Airport)
    WHERE
      ALL(i IN RANGE(0, LENGTH(p)-1) WHERE
        TYPE(RELATIONSHIPS(p)[i]) = ['ORIGIN', 'DESTINATION'][i] AND
        (i%4 <> 1 OR (i + 2) > LENGTH(p) OR
          (apoc.date.parse(NODES(p)[i].date,'m','MM/dd/yyyy hh:mm:ss') + NODES(p)[i].duration + 30) < apoc.date.parse(NODES(p)[i+2].date,'m','MM/dd/yyyy hh:mm:ss'))
      ) AND
      REDUCE(s = 0, n IN [k IN RANGE(1, LENGTH(p), 2) | NODES(p)[k]] |
        s + [(n)<-[:ASSIGN]-(ticket) | ticket.price][0]
      ) < 3000
    RETURN p
    

    查询使用apoc.date.parse 函数将每个date 转换为纪元分钟数,以便在其中添加一个duration(假设也是分钟)。

    【讨论】:

    • 我不知道如何,但它似乎有效。不幸的是,这段代码没有提供关于出发和到达时间的部分
    • 现在它不起作用。是否可以选择在现有关系和节点的基础上创建新的关系?例如,我可以与机票、航班以及连接到始发地和目的地机场的所有值创建关系吗?
    • 您可以这样做,但不建议存储冗余数据,因为它会增加很多复杂性(并且很难保持所有内容一致),并且会占用更多资源。
    【解决方案2】:

    我认为,您应该建立新的关系,例如从机场飞往机场的机票价格和机票等级。它可能很有用。 那么您可以更轻松地找到航班。

     match 
    (a:Airport )<-[:ORIGIN]-(f:Flight)-[:DESTINATION ]->(b:Airport ),
    (f)-[:ASSIGN]-(t:Ticket)
    CREATE (a)-[r:FLY_TO {price:t.price,Class:t.class} ]->(b)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多