-
Notifications
You must be signed in to change notification settings - Fork 0
Statystyki
Marcin Włodarczyk edited this page Jan 22, 2021
·
7 revisions
Metoda | URL | Opis | Status |
---|---|---|---|
GET |
http://localhost:3000/stats/products/customers/:customerID/orders?from&to |
Pokaż listę produktów kupionych przez klienta w danym okresie czasu | Zrobione |
GET |
http://localhost:3000/stats/products/:id |
Pokaż statystyki dla konkretnego produktu | Zrobione |
GET |
http://localhost:3000/stats/products |
Pokaż statystyki dla wszystkich produktów | Zrobione |
GET |
http://localhost:3000/stats/categories/:id |
Pokaż statystyki konkretnej kategorii | Zrobione |
GET |
http://localhost:3000/stats/suppliers/:id/customers/:from/:to/manyqueries |
Pokaż listę klientów obsłużonych przez konkretnego dostawcę w danym okresie czasu. Wykorzystanie kilku pojedynczych zapytań - do celów porównawczych z jednym złożonym zapytaniem | Zrobione |
GET |
http://localhost:3000/stats/suppliers/:id/customers/:from/:to/onequery |
Pokaż listę klientów obsłużonych przez konkretnego dostawcę w danym okresie czasu. Wykorzystanie jednego złożonego zapytania. | Zrobione |
Średni pomiar czasu przetwarzania zapytania (dla 100 wywołań) do endpointu /stats/suppliers/:id/customers/:from/:to
dla przypadku:
- większej ilości prostych zapytań: 4212 ms
- jednego złożonego zapytania: 837 ms
Metoda | URL | Opis |
---|---|---|
GET |
http://localhost:3000/stats/categories/:id |
Pokaż wybrane statystyki (takie jak najczęściej sprzedawany produkt czy całkowita ilość sprzedanych produktów) dla kategorii o danym ID |
MATCH (o:Order)-[contains:CONTAINS]->(p:Product)-[belongs:BELONGS_TO]->(c:Category)
WHERE c.id=$id
CALL {
MATCH (o:Order)-[contains:CONTAINS]->(p:Product)-[belongs:BELONGS_TO]->(c:Category),
(s:Supplier)-[supplies:SUPPLIES]->(p:Product)
WHERE c.id=$id
RETURN {
supplier: s.companyName,
mostSoldProduct: p.name,
mostSoldProductUnitsSold: sum(contains.quantity)
} as mostSold ORDER BY mostSold.mostSoldProductUnitsSold DESC LIMIT 1
}
RETURN {
categoryName: c.name,
totalIncomeGenerated: sum(contains.unitPrice * contains.quantity * (1 - contains.discount)),
totalUnitsSold: sum(contains.quantity),
averagePrice: avg(contains.unitPrice),
averageDiscount: avg(contains.discount),
totalUnitsInStock: sum(p.unitsInStock),
mostSoldProduct: mostSold.mostSoldProduct,
mostSoldProductUnitsSold: mostSold.mostSoldProductUnitsSold,
mostSoldProductSupplier: mostSold.supplier
}
- Połączenie węzłów Order, Product oraz Category łączącymi je relacjami (klauzula
MATCH
) oraz zwrócenie jedynie ścieżek, w których jest kategoria o określonym ID (WHERE
) - Następnie jest wykonywane podzapytanie (subquery) za pomocą klauzuli
CALL
, w którym łączone są węzły Order, Product, Category oraz Supplier za pomocą łączących je relacji (MATCH
), zwracane są tylko te wyniki, w których jest kategoria o określonym ID (WHERE
), na koniec zwracane są: nazwa najczęściej kupowanego produktu, dostawca najczęściej kupowanego produktu oraz ilość sprzedanych jego sztuk. Jest to wykonane za pomocą zwrócenia wszystkich wyników produktów w tej kategorii, posortowaniu ich malejąco wg ilości sprzedanych sztuk (ORDER BY ... DESC
), a na koniec zwrócenie jedynie pierwszego wyniku (LIMIT 1
), czyli produktu, który był najczęściej kupowany - Na koniec zwracane są wszystkie statystyki (
RETURN
) w formacie JSON, większość jest utworzona za pomocą funkcji agregujących takich jakavg
dla średniej arytmetycznej czysum
dla sumy wartości
{
"mostSoldProduct": "Gnocchi di nonna Alice",
"mostSoldProductSupplier": "Pasta Buttini s.r.l.",
"mostSoldProductUnitsSold": 71489,
"totalUnitsSold": 483721,
"totalUnitsInStock": 358172,
"averagePrice": 83.17252891756951,
"averageDiscount": 0,
"categoryName": "Grains/Cereals",
"totalIncomeGenerated": 40953266.560000144
}
Metoda | URL | Opis |
---|---|---|
GET |
http://localhost:3000/stats/products/:id |
Pokaż wybrane statystyki (takie jak średnia cena czy całkowity wygenerowany przychód) dla produktu o danym ID |
MATCH (o:Order)-[r:CONTAINS]->(p:Product) WHERE p.id=$id
RETURN {
productName: p.name,
totalIncome: sum(r.unitPrice * r.quantity * (1 - r.discount)),
totalUnitsSold: sum(r.quantity),
averagePrice: avg(r.unitPrice),
averageDiscount: avg(r.discount),
maxDiscount: max(r.discount),
countriesShipped: collect(DISTINCT o.shipCountry)
}
- Połączenie węzłów Order oraz Product łączącą je relacją CONTAINS (klauzula
MATCH
) oraz zwrócenie jedynie ścieżek, w których jest kategoria o określonym ID (WHERE
) - Następnie zwracane są statystyki w formacie JSON, które zostały utworzone przy pomocy funkcji agregujących
sum
dla sumy wartości,avg
dla średniej arytmetycznej,max
dla maksymalnej wartości,collect
dla utworzenia listy wartości. Dla statystykicountriesShipped
użyto słowa kluczowegoDISTINCT
aby zostały zwrócone wartości bez duplikatów
{
"totalIncome": 5879219.050000003,
"countriesShipped": [
"Germany",
"Spain",
"Ireland",
"United Kingdom",
"Canada",
"Brazil",
"Sweden",
"United States",
"Denmark",
"Austria",
"France",
"Belgium",
"Switzerland",
"Venezuela",
"Mexico",
"Italy",
"Portugal",
"Finland",
"Argentina",
"Norway",
"Poland"
],
"totalUnitsSold": 68497,
"averagePrice": 85.24909740840036,
"averageDiscount": 0,
"productName": "Chef Anton''s Gumbo Mix",
"maxDiscount": 0
}
Metoda | URL | Opis |
---|---|---|
GET |
http://localhost:3000/stats/products |
Pokaż wybrane statystyki (takie jak średnia cena czy całkowity wygenerowany przychód) dla wszystkich produktów |
MATCH (o:Order)-[r:CONTAINS]->(p:Product)
RETURN
{
productName: p.name,
totalIncome: sum(r.unitPrice * r.quantity * (1 - r.discount)),
totalUnitsSold: sum(r.quantity),
averagePrice: avg(r.unitPrice),
averageDiscount: avg(r.discount),
maxDiscount: max(r.discount),
countriesShipped: collect(DISTINCT o.shipCountry)
}
- Podobnie jak przy "Statystyki dla danego produktu", jednak wyniki nie zostały przefiltrowane za pomocą klauzuli
WHERE
, dzięki temu zostaną zwrócone statystyki dla wszystkich produktów
[
{
"totalIncome": 5879219.050000003,
"countriesShipped": [
"Germany",
"Spain",
"Ireland",
"United Kingdom",
"Canada",
"Brazil",
"Sweden",
"United States",
"Denmark",
"Austria",
"France",
"Belgium",
"Switzerland",
"Venezuela",
"Mexico",
"Italy",
"Portugal",
"Finland",
"Argentina",
"Norway",
"Poland"
],
"totalUnitsSold": 68497,
"averagePrice": 85.24909740840036,
"averageDiscount": 0,
"productName": "Chef Anton''s Gumbo Mix",
"maxDiscount": 0
},
{
"totalIncome": 5889688.710000006,
"countriesShipped": [
"Venezuela",
"Germany",
"United Kingdom",
"Finland",
"United States",
"Spain",
"Sweden",
"France",
"Argentina",
"Italy",
"Brazil",
"Switzerland",
"Ireland",
"Canada",
"Belgium",
"Austria",
"Denmark",
"Mexico",
"Portugal",
"Poland",
"Norway"
],
"totalUnitsSold": 72259,
"averagePrice": 81.78289915966383,
"averageDiscount": 0,
"productName": "Grandma''s Boysenberry Spread",
"maxDiscount": 0
}
]
Bazy danych
B.Kordek M.Włodarczyk G.Zacharski
Informatyka, WIEiT, AGH
2020/2021
Wiki
O projekcie
Baza danych Neo4j
Uruchamianie i testowanie
API wraz z objaśnieniem oraz kodem Cypher
- Operacje CRUD dla węzłów
- Operacje CRUD dla relacji
- Operacje CRUD dla produktu
- Operacje CRUD do składania zamówień
- Statystyki
Tutorial
ToDo