--------------------NOTEBOOK_Ch3_SimpleC360--------------------
--------------------CELL_MARKDOWN_1--------------------
# ![bono](https://raw.githubusercontent.com/datastax/graph-book/master/notebooks/images/logos/grem-3.png) Rozdział 3 
## Zaczynamy: prosta aplikacja Customer 360
Autor notatnika: [Denise Gosnell](https://twitter.com/DeniseKGosnell)


Prosta aplikacja C360 umożliwia rozpoczęcie implementacji myślenia grafowego w firmie. Odpowiednie podejście stanowi podstawę do wprowadzenia danych grafowych do architektury systemu. Okazało się, że najpopularniejszą pomyłką popełnianą przez architektów i projektantów systemów jest zbyt szybkie przechodzenie od modelu koncepcyjnego do szczegółów implementacyjnych technologii grafowych. Musimy uwzględnić więcej czynników, które zaprezentujemy w tym rozdziale.

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

**&#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 trzy części:
#### [Krok 1](#step1): Tworzenie schematu grafu
#### [Krok 2](#step2): Wstawianie danych
#### [Krok 3](#step3): Zapytania C360 w Gremlinie
--------------------CELL_MARKDOWN_3--------------------
## <div id="step1"></div>Krok 1: Tworzenie schematu grafu
[Początek &#x2191;](#topKey)
[Następny: Wczytywanie danych &#x2193;](#step2)
--------------------CELL_MARKDOWN_4--------------------
Rozdział 3 Roboczy model danych:
![ch3_model](https://raw.githubusercontent.com/datastax/graph-book/master/notebooks/images/schema/ch3_schema.png "Zaczynamy od bardzo prostego modelu. W teorii grafów taka struktura jest zwana gwiazdą. Wiele grafów gwiaździstych tworzy galaktykę  ...Tak, są to prawdziwe terminy matematyczne")
--------------------CELL_MARKDOWN_5--------------------
#### Tworzenie etykiet wierzchołków
--------------------CELL_GREMLIN_6--------------------
// etykiety wierzchołków
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--------------------
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--------------------
## <div id="step2"></div>Krok 2: Wstawianie danych
[Początek &#8593;](#topKey)
[Wstecz: Schemat &#x21b5;](#step1)
[Następny: Zapytania &#x2193;](#step3)
--------------------CELL_GREMLIN_10--------------------
michael = g.addV('Customer').
            property('customer_id', "customer_0").
            property('name', "Michael").
            next();
--------------------CELL_MARKDOWN_11--------------------
Podczas dodawania wierzchołków do grafu krok addV wymaga podania całego klucza głównego. W przeciwnym razie pojawi się błąd jak w poniższym przykładzie:
--------------------CELL_GREMLIN_12--------------------
test = g.addV('Customer').
         property('name', "Test").
         next();
--------------------CELL_MARKDOWN_13--------------------
#### Dodawanie pozostałych wierzchołków
--------------------CELL_GREMLIN_14--------------------
                                
account_14 = g.addV('Account').
               property('acct_id', 'acct_14').
               next();
            
loan_32 = g.addV('Loan').
            property('loan_id', "loan_32").
            next();
            
cc_17 = g.addV('CreditCard').
          property('cc_num', "cc_17").
          next();
--------------------CELL_MARKDOWN_15--------------------
#### Dodawanie krawędzi od Michaela do związanych z nim danych
--------------------CELL_GREMLIN_16--------------------
g.addE("owns").
  from(michael).
  to(account_14).
  property("role", "primary").
  next();
  
g.addE("owes").
  from(michael).
  to(loan_32).
  next();
  
g.addE("uses").
  from(michael).
  to(cc_17).
  next();
--------------------CELL_MARKDOWN_17--------------------
#### Dodawanie Marii i połączenie jej z kontem 14
--------------------CELL_GREMLIN_18--------------------
maria = g.addV('Customer').
          property('customer_id', "customer_1").
          property('name', "Maria").
          next();
          
g.addE("owns").
  from(maria).
  to(account_14).
  property("role", "limited").
  next();
--------------------CELL_MARKDOWN_19--------------------
#### Dodawanie pozostałych danych o pozostałych 3 klientach
--------------------CELL_GREMLIN_20--------------------
// Dane o Rashice
rashika = g.addV('Customer').
         property('customer_id', "customer_2").
         property('name', "Rashika").
         next();
acct_5 = g.addV('Account').
           property('acct_id', "acct_5").
           next();
cc_32 = g.addV('CreditCard').
          property('cc_num', "cc_32").
          next();
g.addE("owns").
  from(rashika).
  to(acct_5).
  property("role", "primary").
  next();
g.addE("uses").
  from(rashika).
  to(cc_32).
  next();
--------------------CELL_GREMLIN_21--------------------
// Dane o Jamie
jamie = g.addV('Customer').
         property('customer_id', "customer_3").
         property('name', "Jamie").
         next();
acct_0 = g.addV('Account').
           property('acct_id', "acct_0").
           next();
loan_18 = g.addV('Loan').
          property('loan_id', "loan_18").
          next();
g.addE("owns").
  from(jamie).
  to(acct_0).
  property("role", "primary").
  next();
g.addE("owes").
  from(jamie).
  to(loan_18).
  next();
--------------------CELL_GREMLIN_22--------------------
// Dane o Aaliyah
aaliyah = g.addV('Customer').
         property('customer_id', "customer_4").
         property('name', "Aaliyah").
         next();
loan_80 = g.addV('Loan').
          property('loan_id', "loan_80").
          next();
          
g.addE("owns").
  from(aaliyah).
  to(acct_0).
  property("role", "primary").
  next();
  
g.addE("owes").
  from(aaliyah).
  to(loan_80).
  next();
  
g.addE("owes").
  from(aaliyah).
  to(loan_18).
  next();
--------------------CELL_GREMLIN_23--------------------
dev.with("label-warning", false).V().bothE()
--------------------CELL_MARKDOWN_24--------------------
## <div id="step3"></div>Krok 3: Podstawowe zapytania C360
[Początek &#8593;](#topKey)
[Wstecz: Wczytywanie danych &#x21b5;](#step2)
--------------------CELL_MARKDOWN_25--------------------
#### Zapytanie: Których kart kredytowych używa ten klient?
--------------------CELL_GREMLIN_26--------------------
dev.V().has("Customer", "customer_id", "customer_0"). // WHERE
        out("uses").                                  // JOIN
        values("cc_num")                              // SELECT
--------------------CELL_MARKDOWN_27--------------------
#### Zapytanie: Które konta należą do klienta?
--------------------CELL_GREMLIN_28--------------------
dev.V().has("Customer", "customer_id", "customer_0").// WHERE
        out("owns").                                 // JOIN
        values("acct_id")                            // SELECT
--------------------CELL_MARKDOWN_29--------------------
#### Zapytanie: Które konta należą do klienta? Wynik w formacie JSON  
--------------------CELL_GREMLIN_30--------------------
dev.V().has("Customer", "customer_id", "customer_0"). // WHERE
          as("customer").                             // LABEL
        out("owns").                                  // JOIN
          as("account").                              // LABEL
        select("customer", "account").                // SELECT
          by(values("name")).                         // SELECT BY (dla klienta)
          by(values("acct_id"))                       // SELECT BY (dla konta)
--------------------CELL_MARKDOWN_31--------------------
#### Zapytanie: Które kredyty klient musi spłacać?
--------------------CELL_GREMLIN_32--------------------
dev.V().has("Customer", "customer_id", "customer_4"). // WHERE
      out("owes").                                    // JOIN
      values("loan_id")                               // SELECT
--------------------CELL_MARKDOWN_33--------------------
#### Zapytanie: Co wiadomo o tym kliencie?
--------------------CELL_GREMLIN_34--------------------
dev.V().has("Customer", "customer_id", "customer_0"). // WHERE
      out().                                          // JOIN
      elementMap()                                    // SELECT *
      
// Uwaga: Poniższe ostrzeżenie jest oczekiwane, ponieważ nie podaliśmy etykiety krawędzi w kroku out()
--------------------CELL_MARKDOWN_35--------------------
#### Koniec notatnika
