lab2
.pdf
home_address: 'г. Самара, Московское |
|
phone: '+79218901234' |
|
шоссе, д. 15', |
|
}) |
|
phone: '+79216789012' |
|
|
|
}) |
|
CREATE (:Customer { |
|
|
|
|
id: 'CLIENT009', |
CREATE (:Customer { |
|
|
full_name: 'Орлов Михаил Борисович', |
id: 'CLIENT007', |
|
|
passport_series_number: 'II-987654', |
full_name: 'Алексеев Павел Иванович', |
|
|
home_address: 'г. Казань, Кремлёвская |
passport_series_number: 'GG-789012', |
|
улица, д. 45', |
|
home_address: 'г. Ростов-на-Дону, |
|
phone: '+79219012345' |
|
Будённовский проспект, д. 30', |
|
}) |
|
phone: '+79217890123' |
|
|
|
}) |
|
CREATE (:Customer { |
|
|
|
|
id: 'CLIENT010', |
CREATE (:Customer { |
|
|
full_name: 'Романова Ирина Николаевна', |
id: 'CLIENT008', |
|
|
passport_series_number: 'JJ-654321', |
f u l l _ n a m e : ' Н и ко л а е в а |
Т а т ь я н а |
home_address: 'г. Нижний Новгород, |
|
Александровна', |
|
Большая Покровская улица, д. 25', |
|
passport_series_number: 'HH-345678', |
|
|
phone: '+79210123456' |
home_address: 'г. Уфа, Проспект Октября, |
}) |
||
д. 120', |
|
|
|
Рисунок 15 - Создание узлов покупателей
Создание узлов продавцов, результат представлен на рисунке 16, а заполнение в
листинге 3. |
|
|
Листинг 3. Создание узлов продавцов |
|
|
// Создаем узлы-продавцы |
|
salary: 60000 |
CREATE (:Seller { |
|
}) |
id: 'SELLER001', |
|
|
full_name: 'Семенов Алексей Петрович', |
CREATE (:Seller { |
|
passport_series_number: 'KK-123456', |
|
id: 'SELLER003', |
phone: '+79211234567', |
|
full_name: 'Котов Александр Олегович', |
salary: 50000 |
|
passport_series_number: 'MM-345678', |
}) |
|
phone: '+79213456789', |
|
|
salary: 55000 |
CREATE (:Seller { |
|
}) |
id: 'SELLER002', |
|
|
f u l l _ n a m e : ' К о р н е е в а |
М а р и н аCREATE (:Seller { |
|
Владимировна', |
|
id: 'SELLER004', |
passport_series_number: 'LL-789012', |
|
full_name: 'Белкин Юрий Николаевич', |
phone: '+79212345678', |
|
passport_series_number: 'NN-987654', |
phone: '+79214567890', salary: 52000
})
CREATE (:Seller { id: 'SELLER005',
full_name: 'Юдина Юлия Андреевна', passport_series_number: 'OO-654321', phone: '+79215678901',
salary: 58000 })
CREATE (:Seller { id: 'SELLER006',
full_name: 'Казаков Денис Александрович', passport_series_number: 'PP-123456', phone: '+79216789012',
salary: 54000 })
CREATE (:Seller { id: 'SELLER007',
full_name: 'Волков Владислав Евгеньевич', passport_series_number: 'QQ-789012', phone: '+79217890123',
salary: 56000
})
CREATE (:Seller { id: 'SELLER008',
full_name: 'Чернова Наталья Игоревна', passport_series_number: 'RR-345678', phone: '+79218901234',
salary: 53000 })
CREATE (:Seller { id: 'SELLER009',
full_name: 'Голубев Игорь Анатольевич', passport_series_number: 'SS-987654', phone: '+79219012345',
salary: 57000 })
CREATE (:Seller { id: 'SELLER010',
f u l l _ n a m e : 'З а х а р ч е н ко О к с а н а Михайловна',
passport_series_number: 'TT-654321', phone: '+79210123456',
salary: 59000 })
Рисунок 16 - Создание узлов продавцов
Создание узлов заказов, результат представлен на рисунке 17, а заполнение в листинге
4. |
|
Листинг 4. Создание узлов заказов |
|
// Создаем узлы-заказы |
id: 'ORDER002', |
CREATE (:Order { |
purchase_date: '2023-10-05', |
id: 'ORDER001', |
payment_method: 'Картой', |
purchase_date: '2023-10-01', |
car_id: 'CAR002', |
payment_method: 'Наличные', |
client_id: 'CLIENT002', |
car_id: 'CAR001', |
seller_id: 'SELLER002' |
client_id: 'CLIENT001', |
}) |
seller_id: 'SELLER001' |
|
}) |
CREATE (:Order { |
|
id: 'ORDER003', |
CREATE (:Order { |
purchase_date: '2023-10-10', |
payment_method: 'Кредит', car_id: 'CAR003', client_id: 'CLIENT003', seller_id: 'SELLER003'
})
CREATE (:Order { id: 'ORDER004',
purchase_date: '2023-10-15', payment_method: 'Онлайн оплата', car_id: 'CAR004',
client_id: 'CLIENT004', seller_id: 'SELLER004'
})
CREATE (:Order { id: 'ORDER005',
purchase_date: '2023-10-20', payment_method: 'Банковский перевод', car_id: 'CAR005',
client_id: 'CLIENT005', seller_id: 'SELLER005'
})
CREATE (:Order { id: 'ORDER006',
purchase_date: '2023-10-25', payment_method: 'Наличными', car_id: 'CAR006',
client_id: 'CLIENT006', seller_id: 'SELLER006'
})
CREATE (:Order {
id: 'ORDER007', purchase_date: '2023-10-30', payment_method: 'Картой', car_id: 'CAR007',
client_id: 'CLIENT007', seller_id: 'SELLER007'
})
CREATE (:Order { id: 'ORDER008',
purchase_date: '2023-11-05', payment_method: 'Кредит', car_id: 'CAR008',
client_id: 'CLIENT008', seller_id: 'SELLER008'
})
CREATE (:Order { id: 'ORDER009',
purchase_date: '2023-11-10', payment_method: 'Онлайн оплата', car_id: 'CAR009',
client_id: 'CLIENT009', seller_id: 'SELLER009'
})
CREATE (:Order { id: 'ORDER010',
purchase_date: '2023-11-15', payment_method: 'Банковский перевод', car_id: 'CAR010',
client_id: 'CLIENT010', seller_id: 'SELLER010'
})
Рисунок 17 - Создание узлов заказов
Листинг 6. Создание связей
// Соединяем заказчиков с заказами
MATCH (c:Customer {id: 'CLIENT001'}), (o:Order {id: 'ORDER001'}) MERGE (c)-[:MADE_ORDER]->(o); // Сделал заказ
MATCH (c:Customer {id: 'CLIENT002'}), (o:Order {id: 'ORDER002'})
MERGE (c)-[:MADE_ORDER]->(o);
MATCH (c:Customer {id: 'CLIENT003'}), (o:Order {id: 'ORDER003'}) MERGE (c)-[:MADE_ORDER]->(o);
MATCH (c:Customer {id: 'CLIENT004'}), (o:Order {id: 'ORDER004'}) MERGE (c)-[:MADE_ORDER]->(o);
MATCH (c:Customer {id: 'CLIENT005'}), (o:Order {id: 'ORDER005'}) MERGE (c)-[:MADE_ORDER]->(o);
MATCH (c:Customer {id: 'CLIENT006'}), (o:Order {id: 'ORDER006'}) MERGE (c)-[:MADE_ORDER]->(o);
MATCH (c:Customer {id: 'CLIENT007'}), (o:Order {id: 'ORDER007'}) MERGE (c)-[:MADE_ORDER]->(o);
MATCH (c:Customer {id: 'CLIENT008'}), (o:Order {id: 'ORDER008'}) MERGE (c)-[:MADE_ORDER]->(o);
MATCH (c:Customer {id: 'CLIENT009'}), (o:Order {id: 'ORDER009'}) MERGE (c)-[:MADE_ORDER]->(o);
MATCH (c:Customer {id: 'CLIENT010'}), (o:Order {id: 'ORDER010'}) MERGE (c)-[:MADE_ORDER]->(o);
// Соединяем продавцов с заказами
MATCH (s:Seller {id: 'SELLER001'}), (o:Order {id: 'ORDER001'}) MERGE (s)-[:HANDLED_ORDER]->(o); // Обработал заказ
MATCH (s:Seller {id: 'SELLER002'}), (o:Order {id: 'ORDER002'}) MERGE (s)-[:HANDLED_ORDER]->(o);
MATCH (s:Seller {id: 'SELLER003'}), (o:Order {id: 'ORDER003'}) MERGE (s)-[:HANDLED_ORDER]->(o);
MATCH (s:Seller {id: 'SELLER004'}), (o:Order {id: 'ORDER004'}) MERGE (s)-[:HANDLED_ORDER]->(o);
MATCH (s:Seller {id: 'SELLER005'}), (o:Order {id: 'ORDER005'}) MERGE (s)-[:HANDLED_ORDER]->(o);
MATCH (s:Seller {id: 'SELLER006'}), (o:Order {id: 'ORDER006'}) MERGE (s)-[:HANDLED_ORDER]->(o);
MATCH (s:Seller {id: 'SELLER007'}), (o:Order {id: 'ORDER007'}) MERGE (s)-[:HANDLED_ORDER]->(o);
MATCH (s:Seller {id: 'SELLER008'}), (o:Order {id: 'ORDER008'}) MERGE (s)-[:HANDLED_ORDER]->(o);
MATCH (s:Seller {id: 'SELLER009'}), (o:Order {id: 'ORDER009'}) MERGE (s)-[:HANDLED_ORDER]->(o);
MATCH (s:Seller {id: 'SELLER010'}), (o:Order {id: 'ORDER010'}) MERGE (s)-[:HANDLED_ORDER]->(o);
// Соединяем заказы с автомобилями
MATCH (o:Order {id: 'ORDER001'}), (c:Car {id: 'CAR001'}) MERGE (o)-[:INCLUDES_CAR]->(c); // Включает автомобиль
MATCH (o:Order {id: 'ORDER002'}), (c:Car {id: 'CAR002'}) MERGE (o)-[:INCLUDES_CAR]->(c);
MATCH (o:Order {id: 'ORDER003'}), (c:Car {id: 'CAR003'}) MERGE (o)-[:INCLUDES_CAR]->(c);
MATCH (o:Order {id: 'ORDER004'}), (c:Car {id: 'CAR004'}) MERGE (o)-[:INCLUDES_CAR]->(c);
MATCH (o:Order {id: 'ORDER005'}), (c:Car {id: 'CAR005'}) MERGE (o)-[:INCLUDES_CAR]->(c);
MATCH (o:Order {id: 'ORDER006'}), (c:Car {id: 'CAR006'}) MERGE (o)-[:INCLUDES_CAR]->(c);
MATCH (o:Order {id: 'ORDER007'}), (c:Car {id: 'CAR007'}) MERGE (o)-[:INCLUDES_CAR]->(c);
MATCH (o:Order {id: 'ORDER008'}), (c:Car {id: 'CAR008'}) MERGE (o)-[:INCLUDES_CAR]->(c);
MATCH (o:Order {id: 'ORDER009'}), (c:Car {id: 'CAR009'}) MERGE (o)-[:INCLUDES_CAR]->(c);
MATCH (o:Order {id: 'ORDER010'}), (c:Car {id: 'CAR010'}) MERGE (o)-[:INCLUDES_CAR]->(c);
10 запросов разной степени сложности представлены ниже:
Листинг 6. Нахождение всех автомобилей бренда Audi
MATCH (c:Car) WHERE c.brand = 'Audi' RETURN c.id as Id, c.model as Model
Рисунок 18 - Результат выполнения запроса
Листинг 7. Нахождение продавцов с зарплатой больше 55 тысяч рублей
MATCH (s:Seller) WHERE s.salary > 55000 RETURN s.full_name as FullName, s.salary as Salary
Рисунок 19 - Результат выполнения запроса
Листинг 8. Получение всех заказов, оплаченных наличными
MATCH (o:Order) WHERE o.payment_method = 'Наличные' RETURN o.id as OrderId, o.purchase_date as PurchaseDate
Рисунок 20 - Результат выполнения запроса
Листинг 9. Получение всех автомобилей, доступных на складе
MATCH (c:Car) WHERE c.availability = 'Да' RETURN c.id as Id, c.brand as Brand, c.model
as Model
Рисунок 21 - Результат выполнения запроса
Листинг 10. Нахождение всех клиентов, которые совершили покупку автомобиля стоимость
свыше 20 тысяч рублей
MATCH (c:Customer)-[:MADE_ORDER]->(o:Order)-[:INCLUDES_CAR]->(car:Car) WHERE car.price > 20000
RETURN c.full_name AS FullName, car.brand AS Brand, car.model AS Model ORDER BY car.price DESC
Рисунок 22 - Результат выполнения запроса
Листинг 11. Нахождение продавца, обслужившего больше всего заказов
MATCH (s:Seller)-[:HANDLED_ORDER]->(o:Order) RETURN s.full_name AS FullName, COUNT(o) AS NumOrders
ORDER BY NumOrders DESC
LIMIT 1
Рисунок 23 - Результат выполнения запроса
Листинг 12. Нахождение всех автомобилей, включенных в заказы за октябрь 2023. MATCH (o:Order)-[:INCLUDES_CAR]->(c:Car)
WHERE o.purchase_date STARTS WITH '2023-10' RETURN c.brand AS Brand, c.model AS Model ORDER BY c.brand ASC
Рисунок 24 - Результат выполнения запроса
Листинг 13. Получение общего дохода от продажи автомобилей в октябре 2023 года. MATCH (o:Order)-[:INCLUDES_CAR]->(c:Car)
WHERE o.purchase_date STARTS WITH '2023-10' RETURN SUM(c.price) AS TotalIncome
Рисунок 25 - Результат выполнения запроса
Листинг 14. Получение страны, автомобили из которой чаще всего покупают. MATCH (o:Order)-[:INCLUDES_CAR]->(c:Car)
RETURN c.color AS Color, COUNT(*) AS NumPurchases ORDER BY NumPurchases DESC
LIMIT 1
Рисунок 26 - Результат выполнения запроса
Листинг 15. Получение покупателя, сделавшего больше всего заказов. MATCH (c:Customer)-[:MADE_ORDER]->(o:Order)
RETURN c.full_name AS FullName, COUNT(o) AS NumOrders ORDER BY NumOrders DESC
LIMIT 1
Рисунок 27 - Результат выполнения запроса
Листинг 16. Получение самого дорогого транспортного средство среди тех, что включены в
заказы, выполненные сотрудником с самой низкой заработной платой.
MATCH (s:Seller)
WITH MIN(s.salary) AS min_salary
MATCH (s:Seller)-[:HANDLED_ORDER]->(o:Order)-[:INCLUDES_CAR]->(c:Car) WHERE s.salary = min_salary
RETURN c.brand AS Brand, c.model AS Model, c.price AS Price ORDER BY c.price DESC
LIMIT 1
Рисунок 28 - Результат выполнения запроса
Вывод
Реализация графовой базы данных для автосалона оказалась эффективной и удобной для анализа данных и построения сложных связей между объектами. Графовые структуры позволяют быстро искать связи между клиентами, заказами, автомобилями и продавцами,
значительно облегчая выполнение бизнес-задач. С помощью предложенной схемы и примеров запросов становится возможным получение детальной аналитики, необходимой для эффективного управления бизнесом и принятия решений.
Таким образом, проект успешно демонстрирует преимущества использования графовых технологий в бизнесе и служит хорошим примером применения теории графов на практике.
