Skip to content

Statystyki

Marcin Włodarczyk edited this page Jan 22, 2021 · 7 revisions

Statystyki

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

Statystyki dla danej kategorii

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

Zapytanie w języku Cypher:

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
}

Tok postępowania przy tworzeniu i realizacji zapytania:

  • 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 jak avg dla średniej arytmetycznej czy sum dla sumy wartości

Przykładowy wynik zapytania:

{
    "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
}

Statystyki dla danego produktu

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

Zapytanie w języku Cypher:

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) 
}

Tok postępowania przy tworzeniu i realizacji zapytania:

  • 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 statystyki countriesShipped użyto słowa kluczowego DISTINCT aby zostały zwrócone wartości bez duplikatów

Przykładowy wynik zapytania:

{
    "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
}

Statystyki dla wszystkich produktów

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

Zapytanie w języku Cypher:

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) 
}

Tok postępowania przy tworzeniu i realizacji zapytania:

  • 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

Przykładowy wynik zapytania:

[
    {
        "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
    }
]