У меня есть фрейм данных в формате ниже:
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**
Может ли кто-нибудь помочь мне в достижении этого результата?
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, демонстрирующий эти запросы.
Похожие вопросы
Новые вопросы
neo4j
Neo4j - это графическая база данных с открытым исходным кодом (GDB), хорошо подходящая для связанных данных. Пожалуйста, указывайте свою точную версию Neo4j, задавая вопросы. Вы можете использовать его для механизмов рекомендаций, обнаружения мошенничества, поиска на основе графиков, сетевых операций / безопасности и многих других пользовательских случаев. Доступ к базе данных осуществляется через официальные драйверы в Java, JavaScript, Python и .NET или через драйверы сообщества в PHP, Ruby, R, Golang, Elixir, Swift и других.