【问题标题】:Neo4J query to get top N resultsNeo4J 查询以获得前 N 个结果
【发布时间】:2022-01-04 22:48:50
【问题描述】:

我有一个名为 Airports 的节点包含有关机场的数据,还有一个名为 Routes 的节点有大量往返机场的航班 (SourceID, DestinationID)。

该节点上的数据如下所示:

Airline AirlineID Source SourceID Destination DestinationID Codeshare Stops Equipment
2B 410 AER 2965 KZN 2990 0 CR2
2B 410 ASF 2966 KZN 2990 0 CR2
2B 410 ASF 2966 MRV 2962 0 CR2
2B 410 CEK 2968 KZN 2990 0 CR2

我创建了关系类型 (1) SOURCE 和 (2) DESTINATION,显示前往其他机场的方向

  1. SourceID -> DestinationID
  2. DestinationID -> SourceID

我需要编写一个查询来返回航班总数最多的前 5 个机场(入境/出境)。

当运行以下代码结果是正确的:

MATCH (f)-[:SOURCE]->(a:Airport) 
WITH a, COUNT(*) as Count 
RETURN a.name AS AirportName, Count AS TotalFlights 
ORDER BY Count DESC LIMIT 5;

如果我尝试运行以下命令来获得总航班数,结果不是。

MATCH (f)-[:SOURCE]->(a:Airport)<-[:DESTINATION]-(f)
WITH a, COUNT(*) as Count 
RETURN a.name AS AirportName, Count AS TotalFlights 
ORDER BY Count DESC LIMIT 5;

谁能帮帮我?我是NEO4J的新手。

【问题讨论】:

    标签: graph neo4j cypher


    【解决方案1】:

    您的查询没有返回任何结果,因为您只为单个 route 节点分配了两次相同的变量 f。因此,此查询将仅计算与同一机场有 SOURCE 和 DESTINATION 关系的路线(通常没有多大意义)。

    MATCH (f)-[:SOURCE]->(a:Airport)<-[:DESTINATION]-(f)
    WITH a, COUNT(*) as Count 
    RETURN a.name AS AirportName, Count AS TotalFlights 
    ORDER BY Count DESC LIMIT 5;
    

    按照其他人的建议,简单地计算关系(获得节点度)就足够了:

    MATCH (a:Airport)
    WITH a, SIZE((a)<-[:SOURCE|DESTINATION]-()) as numOfFlights 
    RETURN a.name as airportName, numOfFlights
    ORDER BY numOfFlights DESC
    LIMIT 5;
    

    【讨论】:

      【解决方案2】:

      也许你可以只计算关系(即计算机场节点的度数):

      MATCH (a:Airport)
      RETURN a.name as AirportName, size( (a)-[:SOURCE|DESTINATION]-() ) as TotalFlights 
      ORDER BY TotalFlights DESC LIMIT 5;
      

      还有获取节点度数的apoc函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-09
        相关资源
        最近更新 更多