--------------------NOTEBOOK_Ch5_Neighborhoods_prod--------------------
--------------------CELL_MARKDOWN_1--------------------
# ![bono](https://raw.githubusercontent.com/datastax/graph-book/master/notebooks/images/logos/grem-5.png) Rozdział 5 
## Eksploracja sąsiedztw w środowisku produkcyjnym
Autor notatnika: [Denise Gosnell](https://twitter.com/DeniseKGosnell)

Zmiana paradygmatu związana z korzystaniem ze środowiska Apache Cassandra polega na zapisaniu danych w sposób w jaki będziemy je odczytywać. To samo dotyczy pracy z rozproszonymi listami sąsiedztwa w programie DataStax graph.

---------------

**&#9888;** Nie wszystkie komórki rozwijają się domyślnie. Ich treść jest ukryta, jak w przypadku tej komórki. Kliknij oko w prawym rogu komórki, aby wyświetlić i ukryć kod komórki.

--------------------CELL_MARKDOWN_2--------------------
## <div id="topKey"></div>Ten notatnik jest podzielony na cztery części:
#### [Krok 1](#step1): Tworzenie schematu grafu
#### [Krok 2](#step2): Wstawianie danych
#### [Krok 3](#step3): Inspekcja tabel Cassandry w programie Studio
#### [Krok 4](#step4): Zapytania produkcyjne w Gremlinie
--------------------CELL_MARKDOWN_3--------------------
## <div id="step1"></div>Krok 1: Tworzenie schematu grafu
[Początek &#x2191;](#topKey)
[Następne: Wstawianie danych &#x2193;](#step2)
--------------------CELL_MARKDOWN_4--------------------
Produkcyjny model danych dla rozdziału 5:
![ch5_model](https://raw.githubusercontent.com/datastax/graph-book/master/notebooks/images/schema/ch5_schema.png "Gotowy schemat produkcyjny dla przykładu customer 360.")
--------------------CELL_MARKDOWN_5--------------------
#### Tworzenie etykiet wierzchołków
--------------------CELL_GREMLIN_6--------------------
// etykiety wierzchołków z rozdziału 4.
schema.vertexLabel('Transaction').
       ifNotExists().
       partitionBy('transaction_id', Int).
       property('transaction_type', Text).
       property('timestamp', Text).
       create();

schema.vertexLabel('Vendor').
       ifNotExists().
       partitionBy('vendor_id', Int).
       property("vendor_name", Text).
       create();
       
// etykiety wierzchołków z rozdziału 3.
schema.vertexLabel('Customer').
       ifNotExists().
       partitionBy('customer_id', Text).
       property('name', Text).
       create();

schema.vertexLabel('Account').
       ifNotExists().
       partitionBy('acct_id', Text).
       create();

schema.vertexLabel('Loan').
       ifNotExists().
       partitionBy('loan_id', Text).
       create();

schema.vertexLabel('CreditCard').
       ifNotExists().
       partitionBy('cc_num', Text).
       create();
--------------------CELL_MARKDOWN_7--------------------
#### Tworzenie etykiet krawędzi
--------------------CELL_GREMLIN_8--------------------
// nowe krawędzie dla rozdziału 5.
schema.edgeLabel('withdraw_from').
       ifNotExists().
       from('Transaction').
       to('Account').
       clusterBy('timestamp', Text). // sortowanie krawędzi według czasu 
       create();

schema.edgeLabel('deposit_to').
       ifNotExists().
       from('Transaction').
       to('Account').
       clusterBy('timestamp', Text). // sortowanie krawędzi według czasu
       create();

schema.edgeLabel('charge').
       ifNotExists().
       from('Transaction').
       to('CreditCard').
       clusterBy('timestamp', Text). // sortowanie krawędzi według czasu
       create();

// etykiety krawędzi z rozdziału 4.
schema.edgeLabel('pay').
       ifNotExists().
       from('Transaction').
       to('Loan').
       create();

schema.edgeLabel('pay').
       ifNotExists().
       from('Transaction').
       to('Vendor').
       create();
       
// etykiety krawędzi z rozdziału 3.
schema.edgeLabel('owes').
       ifNotExists().
       from('Customer').
       to('Loan').
       create();
       
schema.edgeLabel('uses').
       ifNotExists().
       from('Customer').
       to('CreditCard').
       create();

schema.edgeLabel('owns').
       ifNotExists().
       from('Customer').
       to('Account').
       property('role', Text).
       create();
--------------------CELL_MARKDOWN_9--------------------
#### Tworzenie indeksów krawędzi
--------------------CELL_MARKDOWN_10--------------------
#### Możesz użyć zapytań z rozdziału 5. i kroku <tt>indexFor.analyze()</tt>, aby automatycznie ustalić potrzebne indeksy krawędzi.
--------------------CELL_GREMLIN_11--------------------
schema.indexFor(g.V().has("Customer", "customer_id", "customer_0").
                    out("owns").
                    in("withdraw_from", "deposit_to").
                    order().
                      by(values("timestamp"), desc).
                    limit(20).
                    values("transactionId")).
       analyze()
--------------------CELL_MARKDOWN_12--------------------
#### Oprócz powyższych dwóch indeksów potrzbny jest jeszcze jeden na krawędzi <tt>charge</tt>.
--------------------CELL_GREMLIN_13--------------------
schema.edgeLabel('deposit_to').
       from('Transaction').
       to('Account').
       materializedView('Transaction__deposit_to__Account_by_Account_acct_id').
       ifNotExists().
       inverse().
       create()

schema.edgeLabel('withdraw_from').
       from('Transaction').
       to('Account').
       materializedView('Transaction__withdraw_from__Account_by_Account_acct_id').
       ifNotExists().
       inverse().
       create()
       
schema.edgeLabel('charge').
       from('Transaction').
       to('CreditCard').
       materializedView('Transaction__charge__CreditCard_cc_num').
       ifNotExists().
       inverse().
       create()
--------------------CELL_MARKDOWN_14--------------------
## <div id="step2"></div>Krok 2: Wstawianie danych
[Początek &#8593;](#topKey)
[Wstecz: Schema &#x21b5;](#step1)
[Następne: Inspekcja tabel CQL w programie Studio &#x2193;](#step3)
--------------------CELL_MARKDOWN_15--------------------
#### Wykonaj poniższe instrukcje dotyczące importowania danych grafowych za pomocą narzędzia DataStax Bulk Loader.

Oto instrukcje:
1. Otwórz skrypt do wczytywania danych dla rozdziału 5. <tt>./ch5_load.sh</tt>
2. Uaktualnij ścieżki, aby wkazywały na poprawne katalogi w lokalnym środowisku
3. Uruchom skrypt: <tt>./ch5_load.sh</tt>
--------------------CELL_MARKDOWN_16--------------------
#### Potwierdzenie, że `customer_0` został wczytany i weryfikacja jego właściwości:
--------------------CELL_GREMLIN_17--------------------
g.V().has("Customer", "customer_id", "customer_0").
      elementMap()
--------------------CELL_MARKDOWN_18--------------------
## <div id="step3"></div>Krok 3: Inspekcja tabel Cassandry w programie Studio
[Początek &#8593;](#topKey)
[Wstecz: Wstawianie danych &#x21b5;](#step2)
[Następne: Zapytania produkcyjne w Gremlinie &#x2193;](#step4)
--------------------CELL_CQL_19--------------------
select * from "Transaction__deposit_to__Account" limit 10;
--------------------CELL_CQL_20--------------------
select * from "Transaction__deposit_to__Account_by_Account_acct_id" limit 10;
--------------------CELL_MARKDOWN_21--------------------
## <div id="step4"></div>Krok 4: Zapytania produkcyjne w Gremlinie
[Początek &#8593;](#topKey)
[Wstecz: Inspekcja tabel CQL w programie Studio &#x21b5;](#step3)

--------------------CELL_MARKDOWN_22--------------------
#### Zapytanie: Znajdź dwadzieścia ostatnich transakcji wykonanych na koncie Michaela
--------------------CELL_GREMLIN_23--------------------
g.V().has("Customer", "customer_id", "customer_0").
      out("owns").
      inE("withdraw_from", "deposit_to"). // użycie perspektywy zmaterializowanej na krawędzi deposit_to  
      order().                            // do posortowania krawędzi
        by("timestamp",desc).             // według czasu
      limit(20).                          // przejście przez 20 najnowszych krawędzi
      outV().                             // przejście do wierzchołków transakcji 
      values("transaction_id")            // pobranie identyfikatorów transakcji transaction_id
--------------------CELL_MARKDOWN_24--------------------
### ![bono](https://i.ibb.co/z7gfj7F/gremlin-unicorn.png) Dodatkowe zapytanie, znajdujące się tylko w notatniku!
SFormatowanie wyników ostatniego zapytania, aby pokazać czas i id transakcji
--------------------CELL_GREMLIN_25--------------------
g.V().has("Customer", "customer_id", "customer_0"). // klient
        out("owns").                       // przejście do jego konta
        inE("withdraw_from", "deposit_to"). // przejście do wszystkich transakcji
        order().                           // sortowanie wierzchołków
          by(values("timestamp"), desc).   // według właściwości timestamp, w kolejności malejącej
        outV().
        limit(20).                         // wybór 20 najnowszych
        project("transaction_id", "timestamp"). // tworzenie mapy z 2 kluczami
              by("transaction_id"). // wartości pierwszego klucza
              by("timestamp")       // wartości drugiego klucza
--------------------CELL_MARKDOWN_26--------------------
#### Zapytanie: Znajdź sklepy, w których Michael dokonał zakupów w grudniu roku i ustal częstotliwość zakupów.
--------------------CELL_GREMLIN_27--------------------
g.V().has("Customer", "customer_id", "customer_0").
      out("uses").
      inE("charge").                           // pobranie krawędzi
          has("timestamp",                     // sortowanie krawędzi
              between("2020-12-01T00:00:00Z",  // początek grudnia 2020
              "2021-01-01T00:00:00Z")).        // koniec grudnia 2020
      outV().                                  // przejście do transakcji
      out("pay").hasLabel("Vendor").           // przejście do sprzedawców
      groupCount().
        by("vendor_name").
      order(local).
        by(values, desc)
--------------------CELL_MARKDOWN_28--------------------
#### Zapytanie: Znajdź i uaktualnij transakcje, mające największe znaczenie dla Jamiego i Aaliyah: spłaty kredytu hipotecznego za pośrednictwem konta.

--------------------CELL_GREMLIN_29--------------------
g.V().has("Customer", "customer_id", "customer_4").    // pobieranie wierzchołka Aaliyah
      out("owns").                                     // przejście do konta
      in("withdraw_from").                             // uwzględniamy tylko wypłaty
      filter(
             out("pay").                               // przejście do kredytów lub sprzedawców
             has("Loan", "loan_id", "loan_18")) .      // zatrzymujemy tylko  loan_18
      property("transaction_type",    // krok mutujący: ustawiamy właściwość"transaction_type"
                "mortgage_payment").  // na "mortgage_payment"
      values("transaction_id", "transaction_type")     // zwraca transakcję i typ
--------------------CELL_MARKDOWN_30--------------------
#### Koniec notatnika
