У меня есть фрейм данных в формате ниже:

    ORIGIN  UNIQUE_CARRIER  DEST    avg_arr_delay
     JFK          AA         LAX    14.56040268
     JFK          B6         LAX    7.085201794
     JFK          DL         LAX    6.475770925
     JFK          VX         LAX    3.939759036
     LAX          AA         MCI    2.3
     LOG          DL         SEA    3.4

У меня есть два узла, созданные в базе данных графа для аэропорта отправления и аэропорта назначения. Это связано с помощью свойства с именем delayed_by, которое указывает на среднюю задержку прибытия. Отношения между узлами представлены ниже:

   MERGE (origin:origin_airport {name: row.ORIGIN})
   MERGE (destination:dest_airport {name: row.DEST})
   MERGE (carrier:Carrier {name: row.UNIQUE_CARRIER})
   MERGE (origin)-[r:delayed_by]->(destination)
   SET  r.arr_delay=row.avg_arr_delay

Я пытаюсь найти среднюю задержку для конкретного аэропорта отправления и назначения. Здесь пытаюсь найти между JFK и LAX. JFK to LAX имеет 4 значения arr_delay, и мне нужно найти среднее значение этих значений. Я использую приведенный ниже запрос шифра для нахождения среднего значения:

MATCH (oa:origin_airport {name:'JFK'})-[r:delayed_by]->(da:dest_airport     
{name:'LAX'})
RETURN oa.name  AS Origin, 
AVG(toFloat(r.arr_delay)) As Arrdelay,
da.name AS Destination

Вместо среднего он берет последнее значение 3,939759036 и возвращает это значение. Но я ожидаю, что цена будет ниже.

ORIGIN    DEST    Average
 JFK       LAX      8.0152

Кроме того, как лучше всего создать отношения между unique_carrier, origin и destination, связанные с помощью отношения delayed_by. При этом мне нужно выбрать конкретную авиакомпанию, скажем, AA между JFK и LAX, и найти среднюю задержку. Что-то вроде ниже работает?

   MERGE (origin:origin_airport {name: row.ORIGIN})
   MERGE (destination:dest_airport {name: row.DEST})
   **MERGE (carrier:Carrier {name: row.UNIQUE_CARRIER})**
   CREATE (origin)-[r:delayed_by]->(destination)
   **CREATE (origin)-[:from]->(carrier)-[r1:delayed_by]->(destination)**
   SET  r.arr_delay=row.avg_arr_delay
   **SET  r1.arr_delay=row.avg_arr_delay**

Может ли кто-нибудь помочь мне в достижении этого результата?

0
Sriram Chandramouli 29 Июн 2016 в 19:35

1 ответ

Лучший ответ

Проблема в том, что поскольку вы используете MERGE при создании отношения delayed_by, вы получаете только одно отношение для каждой пары узлов аэропорта. Вместо этого используйте CREATE для создания отношения:

LOAD CSV WITH HEADERS FROM "https://dl.dropboxusercontent.com/u/67572426/so_flights.csv" AS row  
MERGE (origin:origin_airport {name: row.ORIGIN})     
MERGE (destination:dest_airport {name: row.DEST})     
CREATE (origin)-[r:delayed_by]->(destination)     
SET  r.arr_delay=toFloat(row.avg_arr_delay)

Обратите внимание также на преобразование avg_arr_delay в число с плавающей запятой с помощью функции toFloat.

Теперь вы должны получить ожидаемый результат:

MATCH (oa:origin_airport {name:'JFK'})-[r:delayed_by]->(da:dest_airport {name:'LAX'}) 
RETURN oa.name  AS Origin,  
AVG(toFloat(r.arr_delay)) As Arrdelay, 
da.name AS Destination

Возврат:

Origin  Arrdelay    Destination
JFK   8.01528360875 LAX

Вот экземпляр консоли Neo4j, демонстрирующий эти запросы.

1
William Lyon 29 Июн 2016 в 20:06
Как лучше всего установить связь между unique_carrier, origin и destination. Я обновил свой первоначальный вопрос тем, что я пробовал.
 – 
Sriram Chandramouli
29 Июн 2016 в 23:02