lab3
.pdf
САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ
КАФЕДРА ПРИКЛАДНОЙ ИНФОРМАТИКИ
ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
Канд. техн. наук |
|
Турнецкая Е. Л. |
должность, уч. степень, звание |
подпись, дата |
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №3
Подключение к Neo4J с помощью Python
по курсу: Программная инженерия
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ гр. № |
4111з |
|
Тюттерин Я. Н. |
||
|
|
|
|
|
|
|
|
|
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург 2026
Цель работы: получение практических навыков работы с графической базой данных Neo4j
средствами Python.
Neo4j — это самая распространенная графовая база данных, в которой данные хранятся и обрабатываются в виде вершин (узлов) и рёбер (отношений) между ними. В отличие от реляционных баз данных, где данные организованы в таблицы, Neo4j использует графовую структуру для представления и хранения данных, что делает её особенно эффективной для задач, связанных с взаимосвязями между объектами.
Код представлен в листинге 1, а результат выполнения на рисунках 1-2.
Листинг 1. Выполнение запроса на вставку узла
# Создание драйвера для подключения
driver = GraphDatabase.driver(uri, auth=(username, password))
# Функция для выполнения запросов def execute_query(query):
with driver.session(database=database) as session: result = session.run(query)
return [record for record in result]
# Пример запроса: создание узла Person с именем Bob query = """
CREATE (p:Person {name: 'Bob'}) RETURN p
"""
# Выполнение запроса
results = execute_query(query)
# Обработка и вывод результатов for record in results:
print(record["p"])
# Закрытие подключения driver.close()
Рисунок 1 - Результат выполнения кода
Рисунок 2 - Результат вставки
Изменив программу путем добавления функции создания и просмотра пользователей,
товаров и заказов. Для улучшения безопасности, были вынесены данные подключения к БД в отдельный файл .env. Для работы с переменными окружения понадобился пакет pythondotenv, а для красивого вывода данных в табличном виде prettytable.
Листинг 2. Программа для создания и просмотра пользователей
import os
from dotenv import load_dotenv from neo4j import GraphDatabase
from prettytable import PrettyTable
# Загрузка переменных окружения load_dotenv()
#Получение учетных данных Neo4j из переменных окружения
NEO4J_URI = os.getenv("NEO4J_URI") NEO4J_USERNAME = os.getenv("NEO4J_USERNAME") NEO4J_PASSWORD = os.getenv("NEO4J_PASSWORD") NEO4J_DBNAME = os.getenv("NEO4J_DBNAME")
#Функция для очистки базы данных
def clear_db(session):
session.run("MATCH (n) DETACH DELETE n")
#Функция для заполнения БД[создания узлов (пользователей и товаров) и связей(заказов)] с помощью
#Cypher - запросов
def create_db_by_query(session): query = """
CREATE
(user1:Users {userId:1, userName: 'Петр', userSurname:'Антошин',
birthDate: date('1991-07-10')}),
(user2:Users {userId:2, userName: 'Сергей', userSurname:'Пастухов', birthDate: date('2002-03-11')}),
(user3:Users {userId:3, userName: 'Анна', userSurname:'Рокотова',
birthDate: date('1999-11-17')})
CREATE
(p1:Products {prId:1, prName: 'Смартфон', prDescription:'средство
связи'}),
(p2:Products {prId:2, prName: 'Ноутбук', prDescription:'рабочая станция'}),
(p3:Products {prId:3, prName: 'Телевизор',
prDescription:'каналы о природе'}),
(p4:Products {prId:4, prName: 'Наушники',
prDescription:'слушаем подкасты'}),
(p5:Products {prId:5, prName: 'Кондиционер',
prDescription:''}),
(p6:Products {prId:6, prName: 'Кофемашина', prDescription:'для души'})
CREATE
(user1)-[:ORDER {orderId:1, orderDate:date('2024-06-03'), price:100}]->(p1),
(user2)-[:ORDER {orderId:2, orderDate:date('2024-06-11'), price:200}]->(p2),
(user2)-[:ORDER {orderId:3, orderDate:date('2024-06-11'), price:100}]->(p1),
(user1)-[:ORDER {orderId:4, orderDate:date('2024-06-18'), price:300}]->(p3),
(user1)-[:ORDER {orderId:5, orderDate:date('2024-06-19'), price:50}]->(p4),
(user3)-[:ORDER {orderId:6, orderDate:date('2024-07-10'), price:350}]->(p5),
(user3)-[:ORDER {orderId:7, orderDate:date('2024-07-10'), price:100}]->(p1)
"""
session.run(query)
# Функция вывода информации о всех клиентах def show_users_info(session):
query = """
MATCH (u:Users)
RETURN u.userId, u.userName, u.userSurname, u.birthDate
"""
users = session.run(query) print("\nВсе клиенты:")
users_table = PrettyTable()
users_table.field_names = [ "ID клиента",
"Имя клиента", "Фамилия клиента", "Дата рождения",
]
for user in users: users_table.add_row(
[
user["u.userId"], user["u.userName"], user["u.userSurname"], user["u.birthDate"],
]
)
print(users_table)
# Функция вывода информации о всех товарах
def show_orders_info(session): query = """
MATCH (u:Users)-[o:ORDER]->(p:Products)
RETURN o.orderId, o.orderDate, o.price, u.userId, u.userName, u.userSurname, p.prId, p.prName
ORDER BY o.orderId
"""
orders = session.run(query) print("\nВсе заказы:")
orders_table = PrettyTable()
orders_table.field_names = [ "ID заказа",
"Дата заказа", "Цена",
"ID клиента", "Имя клиента",
"Фамилия клиента", "ID тоавара", "Название товара",
]
for order in orders: orders_table.add_row(
[
order["o.orderId"], order["o.orderDate"], order["o.price"], order["u.userId"], order["u.userName"], order["u.userSurname"], order["p.prId"], order["p.prName"],
]
)
print(orders_table)
# Функция вывода информации о всех заказах def show_products_info(session):
query = """
MATCH (p:Products)
RETURN p.prId, p.prName, p.prDescription
"""
products = session.run(query) print("\nВсе товары:")
products_table = PrettyTable()
products_table.field_names = [ "ID товара",
"Название товара", "Описание товара",
]
for product in products: products_table.add_row(
[
product["p.prId"], product["p.prName"], product["p.prDescription"],
]
)
print(products_table)
# Функция для создания узла пользователя
def create_user(session, userName, userSurname, birthDate, userId=None): if userId is None:
last_id = session.run(
"MATCH (u:Users) RETURN COALESCE(MAX(u.userId), 0) as
last_id"
).single()["last_id"] userId = last_id + 1 session.run(
"""
CREATE (:Users { userId: $userId, userName: $userName,
userSurname: $userSurname, birthDate: date($birthDate) })
""", userId=userId, userName=userName,
userSurname=userSurname, birthDate=birthDate,
)
# Функция для создания узла товара
def create_product(session, prName, prDescription="", prId=None): if prId is None:
last_id = session.run(
"MATCH (p:Products) RETURN COALESCE(MAX(p.prId), 0) as
last_id"
).single()["last_id"] prId = last_id + 1 session.run(
"""
CREATE (:Products { prId: $prId, prName: $prName,
prDescription: $prDescription })
""", prId=prId, prName=prName,
prDescription=prDescription,
)
# Функция для создания отношения заказа
def create_order(session, userId, prId, orderDate, price, orderId=None): if orderId is None:
last_id = session.run(
"MATCH ()-[o:ORDER]->() RETURN COALESCE(MAX(o.orderId), 0)
as last_id" ).single()["last_id"] orderId = last_id + 1
session.run(
"""
MATCH (u:Users {userId: $userId}), (p:Products {prId: $prId}) MERGE (u)-[:ORDER {
orderId: $orderId,
orderDate: date($orderDate), price: $price
}]->(p)
""", userId=userId, prId=prId, orderId=orderId,
orderDate=orderDate, price=price,
)
# Функция для заполнения БД[создания узлов (пользователей и товаров) и связей(заказов)] с помощью созданных функций
def create_db_by_def(session):
# Создание (узлов) пользователей create_user(session, "Петр", "Антошин", "1991-07-10")
create_user(session, "Сергей", "Пастухов", "2002-03-11") create_user(session, "Анна", "Рокотова", "1999-11-17")
# Создание (узлов) товаров
create_product(session, "Смартфон", "средство связи") create_product(session, "Ноутбук", "рабочая станция") create_product(session, "Телевизор", "каналы о природе") create_product(session, "Наушники", "слушаем подкасты") create_product(session, "Кондиционер") create_product(session, "Кофемашина", "для души")
# # Создание [отношений/связей] заказов create_order(session, 1, 1, "2024-06-03", 100) create_order(session, 2, 2, "2024-06-11", 200) create_order(session, 2, 1, "2024-06-11", 100) create_order(session, 1, 3, "2024-06-18", 300) create_order(session, 1, 4, "2024-06-19", 50) create_order(session, 3, 5, "2024-07-10", 350) create_order(session, 3, 1, "2024-07-10", 100)
# Основной блок выполнения def main():
try:
# Подключение к базе данных Neo4j
with GraphDatabase.driver(NEO4J_URI, auth=(NEO4J_USERNAME, NEO4J_PASSWORD)) as driver:
with driver.session(database=NEO4J_DBNAME) as session:
# Очистка базы данных
clear_db(session)
# Заполнение БД create_db_by_def(session)
#create_db_by_query(session)
#Создание товара
create_product(session, "Микроволновка", "Для разогрева
еды")
# Просмотр информации о пользователях
show_users_info(session)
# Просмотр информации о товарах
show_products_info(session)
# Просмотр информации о заказах show_orders_info(session)
except Exception as e: print(f"Произошла ошибка: {e}")
# Запуск основной функции if __name__ == "__main__":
main()
Результаты выполнения листинга 2 представлены на рисунках 3-6.
Рисунок 3 - Результат вставки клиентов
Рисунок 4 - Результат вставки товаров
Рисунок 5 - Результат вставки заказов
Рисунок 6 - Результат вставки узлов и связей
Вариант 10. Автосалон
Существует фирма, торгующая автомобилями. Автомобиль выступает в качестве товара, и, как товар имеет определенные характеристики: код товара, страна-изготовитель,
марка автомобиля, модель, наличие на складе (да, нет, когда будет), цена. Кроме того, на каждый автомобиль имеются технические данные: фирма-производитель, тип кузова,
количество дверей, количество мест, тип двигателя, расположение двигателя, рабочий объем двигателя, мощность двигателя, наличие опций, количество ведущих колес, расход топлива,
время разгона до 100км\ч. Фирма имеет своих клиентов — покупателей автомобилей,
сведения о которых хранят в течение определенного времени. Информация о клиенте: код клиента, паспортные данные (серия, номер), домашний адрес, номер телефона. В заказе указывается информация об автомобиле, клиенте, продавце, способе оплаты, дате продажи.
Информация о продавце-консультанте: паспортные данные, номер телефона, заработная плата.
Листинг 3. Код для заполнения БД данными на основе варианта.
import os
from dotenv import load_dotenv from neo4j import GraphDatabase
# Загрузка переменных окружения load_dotenv()
#Получение учетных данных Neo4j из переменных окружения
NEO4J_URI = os.getenv("NEO4J_URI") NEO4J_USERNAME = os.getenv("NEO4J_USERNAME") NEO4J_PASSWORD = os.getenv("NEO4J_PASSWORD") NEO4J_DBNAME = os.getenv("NEO4J_DBNAME")
#Функция для очистки базы данных
def clear_db(session):
session.run("MATCH (n) DETACH DELETE n")
# Функция для заполнения БД узлами автомобилей def create_cars_by_query(session):
query = """
CREATE (:Car { id: 'CAR001', brand: 'Toyota',
model: 'Corolla', country: 'Japan', availability: 'Да',
price: 15000, body_type: 'седан',
doors_count: 4, seats_count: 5,
