Рубрики
Без рубрики

Создайте простое приложение планирования путешествий с использованием алгоритмов графика, Cypher & Python

Введение Рюкзака – отличный способ изучить мир в бюджете. С его большим т … с меткой Python, алгоритмы, учебник, графдатабаза.

Введение

Рюкзак – это отличный способ изучить мир в бюджете. С его большой транспортной сетью, доступными номерами, а также тысячами достопримечательностей, Европа является идеальным местом путешествия для туристов.

В этом руководстве вы узнаете, как построить простое приложение для планирования путешествий, используя памятку, Cypher и Python. Вы узнаете, как работать с диаграммой базы данных и как запрашивать его с помощью драйвера языка Python. Вы также узнаете, как использовать популярные алгоритмы графика, включая Широк-первый поиск (BFS) и Алгоритм Dijkstra Отказ

Предварительные условия

Чтобы следовать, вам понадобится следующее:

  • Машина работает Linux.
  • Локальная установка мемграфа. Вы можете обратиться к Документация Memgraph Отказ
  • Python Memgraph Client Отказ
  • Основные знания языка программирования Python. Мы будем использовать Python 3 для этого руководства.
  • Основные знания языка циферского запроса.

Шаг 1 – Определение модели данных

Во-первых, мы должны определить модель данных, которую мы будем использовать для создания вашего приложения. Одной из наиболее распространенных моделей данных, используемых для аналитики графика, является модель графика свойств метки (LPG). Эта модель определяется как набор вершин (узлов AKA) и краев (ака) вместе со своими свойствами и этикетками.

В этом уроке вы будете использовать DataSet European Backpacker Index (2018), содержащий информацию о 56 городах, расположенных в 36 европейских странах. Ваша модель будет содержать две типы вершин Город и Страна и три края типов Внутри , Closeeto и Границы Наряду с несколькими свойствами, такими как имена, рейтинги, местные валюты и т. Д.

Теперь, когда вы определили свою модель данных, следующий шаг – импортировать данные в MEMGRAPH.

Шаг 2 – Импорт данных в Memgraph с Cypher и Python

Чтобы импортировать данные в MEMGRAPH, вы будете использовать Cypher queries через клиент Python PymgClient Отказ

PymgClient – это адаптер баз данных Memgraph для языка программирования Python, соответствующий спецификации DB-API 2.0, описанной, описанным PEP 249.

Cypher – это декларативный язык запросов, рассмотренный многими, чтобы быть отраслевым стандартом, когда речь идет о работе с базами данных графика имущества.

Прежде чем начать, вы должны установить PymgClient. . Это позволит вам подключиться к MEMGRAPH и запустить ваши запросы. Для этого мы запустим следующую команду:

pip install pymgclient

Теперь, когда у нас есть PymgClient Установлено, мы готовы импортировать его и подключить его к базе данных MEMGRAPH. Для этого мы будем использовать следующий код Python:

import mgclient

# Connect to the database
connection = mgclient.connect(
    host='127.0.0.1',
    port=7687,
    sslmode=mgclient.MG_SSLMODE_REQUIRE)
connection.autocommit = True

Теперь, когда наш клиент Python подключен к Memgraph, мы готовы начать запустить наши запросы. Чтобы ускорить импорт данных, мы создаем индексы на ID Собственность Город и Страна вершины. Это поможет MemGraph быстро найти города и страны при создании ребер. Обратите внимание, что мы могли бы создать индекс на другом свойстве, например Имя И мы бы достигли того же результата.

[ПРИМЕЧАНИЕ] Индекс базы данных существенно создает избыточную копию некоторых данных в базе данных для повышения эффективности поиска индексированных данных. Тем не менее, это происходит по стоимости дополнительного пространства для хранения и другие пишеты, поэтому решение того, что индексировать и то, что не индексировать, является важным решением.

Для того, чтобы создать свои индексы, мы выполним следующие запросы:

connection.cursor().execute("""
CREATE INDEX ON :City (id)
""")
connection.cursor().execute("""
CREATE INDEX ON :Country (id)
""")

Теперь, когда наши индексы созданы, мы начнем импортировать нашу, начиная с стран. Для этого мы будем запускать следующие Запросы Отказ

Как видите, этот запрос использует Создать пункт, чтобы создать вершину с одной этикеткой, Страна и 2 свойства, ID и название .

Далее мы добавим Город Узлы со всеми своими свойствами, такими как местная валюта, средняя цена приема пищи и напитки, стоимость транспорта и т. Д. Для этого мы будем использовать следующие Запросы Отказ

Как видите, этот запрос использует то же самое Создать пункт для создания узлов с этикеткой Город и 14 различных свойств.

Теперь, когда мы создали все узлы на нашем графике, мы готовы начать добавлять края. Для этого мы будем запускать следующие Запросы Отказ

В этом запросе мы впервые используем Матч пункт, чтобы получить два Город узлы между которыми мы будем создавать край, а затем использовать Создать пункт, чтобы создать край этикетки Closeeto и недвижимость Eu_border с может иметь значение Истинный или Ложь Отказ

Поздравляю! Теперь вы импортировали все ваши набор данных в MEMGRAPH. Теперь вы готовы начать выполнение запросов и алгоритмов.

Шаг 3 – Запуск простых циферных запросов с Python

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

cursor = connection.cursor()
cursor.execute("""
MATCH (n:City)
RETURN n.name, n.cheapest_hostel, n.cost_per_night_USD, n.hostel_url
ORDER BY n.cost_per_night_USD LIMIT 10
""")
print(cursor.fetchall())

Этот запрос соответствует всем вершинам с этикеткой Город И возвращает название города, название самого дешевого общежития, стоимость за ночь для этого хостела и URL-хостела. Затем он занимает результаты, основанные на стоимости за ночь самого дешевого общежития и вернуть 10 лучших результатов.

Что, если вы посещаете Италию, чтобы узнать, какие города рекомендуются для туристов, и который является самым дешевым хостелом для каждого из них. Чтобы получить ответ, вы пройдете следующий запрос:

cursor = connection.cursor()
cursor.execute("""
MATCH (c:City)-[:Inside]->(:Country {name: "Italy"})
RETURN c.name, c.cheapest_hostel, c.total_USD
ORDER BY c.total_USD;
""")
print(cursor.fetchall())

Как вы можете видеть, что запрос напоминает тот, который мы использовали ранее, но вместо того, чтобы соответствовать всем городам, мы только соответствующие те, которые связаны с Италией через край типа Внутри

Шаг 4 – Использование алгоритма поиска сначала первого для поиска и фильтрации путей

Хотя эти запросы дают нам некоторые интересные идеи и результаты, они не являются чем-то, что базы данных графов особенно интересны. Графические базы данных становятся ценными, когда мы начинаем задавать более сложные вопросы, которые включают в себя прохождение произвольного количества ребер. Эти типы запросов PATHFINDING могут стать проблематичными для традиционных баз данных, поскольку они часто требуют нескольких соединений.

Скажем, вы хотите путешествовать из Испании в Россию, но вы хотите выбрать маршрут, который пересекает наименьшее количество границ. Это то, где алгоритм графика, такой как ширина – первый поиск (BSF), пригодится. Чтобы получить ваш ответ, вы будете использовать следующий запрос:

cursor = connection.cursor()
cursor.execute("""
MATCH p = (n:Country {name: "Spain"})
          -[r:Borders * bfs]-
          (m:Country {name: "Russia"})
UNWIND (nodes(p)) AS rows
RETURN rows.name;
""")
print(cursor.fetchall())

Этот запрос оценивает все возможные пути между Испанией и Россией, используя края типа Границы , считает количество переходов по границам для каждого пути и возвращает путь с наименьшим количеством пограничных переходов.

Что, если вы хотите фильтровать пути на основе определенных критериев? Скажем, вы хотите ездить из Братиславы в Мадрид и захотите спланировать свой маршрут, чтобы минимизировать количество остановок. Вы также хотите посетить только страны, которые имеют евро в качестве местной валюты, поскольку это единственная, что вы оставили. Для этого вы будете использовать следующий запрос:

cursor = connection.cursor()
cursor.execute("""
MATCH p = (:City {name: "Bratislava"})
          -[:CloseTo * bfs (e, v | v.local_currency = "Euro")]-
          (:City {name: "Madrid"})
UNWIND (nodes(p)) AS rows
RETURN rows.name;
""")
print(cursor.fetchall())

Как видите, мы добавили специальный синтаксис к запросу (e, v |) . Это называется функцией фильтра лямбда. Фильтр лямбда принимает краевой символ е и символ вершины V и решает, следует ли рассмотреть эту пару ребра и вершины верности в широко-первом расширении, возвращая TRUE или FALSE (или NULL). В этом примере функция лямбда возвращает true, если значение свойства типа v.local_currence городской вершины V равно евро. Как только лучший путь идентифицирован, запрос возвращает Узлы (P) как список, и Расслабиться Пункт распаковывает список в отдельных строках.

Шаг 5 – Использование алгоритма Dijkstra, чтобы найти кратчайший путь

До сих пор вы использовали алгоритм поиска в ширину, чтобы найти путь, который пересек самое маленькое количество ребер. Но что, если вместо этого вы хотели найти кратчайший путь, принимающий во внимание цену жилья для каждого города, который вы посетите на своем пути? Другими словами, что, если вы хотите найти самый короткий самый дешевый путь? Именно здесь алгоритм поиска первого ширина достигает своего предела. BFS будет точно рассчитать кратчайший путь, только если все ребра и вершины либо не имеют веса, либо имеют одинаковый вес.

Когда дело доходит до поиска кратчайшего пути в графе, где ребра и вершины не имеют того же веса, вам нужно будет использовать алгоритм Dijkstra.

Например, скажем, вы хотите путешествовать из Брюсселя в Афины, а вы в тесном бюджете. Чтобы найти самый дешевый маршрут, вы бы использовали следующий запрос:

cursor = connection.cursor()
cursor.execute("""
MATCH p = (:City {name: "Brussels"})
          -[:CloseTo * wShortest (e, v | v.cost_per_night_USD) total_cost]-
          (:City {name: "Athens"})
WITH extract(city in nodes(p) | city.name) AS trip, total_cost
RETURN trip, total_cost;
""")
print(cursor.fetchall())

Как видите, синтаксис практически идентичен нашим запросам BFS. Мы используем взвешенный кратчайший путь wshortest и укажите Cost_Per_night Тип свойства как наш вес. Вес лямбда указывает на стоимость расширения до указанной вершины с использованием данного края v.cost_Per_night_usd и Общая стоимость Символ рассчитывает стоимость поездки. Функция экстракта используется только для отображения названий города. Чтобы получить полный городскую информацию, вы бы вернули Узлы (P) Отказ

Вывод

Там у вас есть! Вы только что узнали, как построить простое приложение планирования маршрута путешествий, используя диаграмму базы данных, Cypher и Python. Вы также узнали, как использовать первый алгоритм поиска и алгоритма поиска и алгоритма Dijkstra для перемещения сложной сети взаимосвязанных данных и фильтруют ваши результаты, используя мощную и гибкую функцию лямбда.

Оригинал: “https://dev.to/karimt1/build-a-simple-travel-planning-application-using-graph-algorithms-python-1pc4”