--------------------NOTEBOOK_Ch4_DataGeneration--------------------
--------------------CELL_MARKDOWN_1--------------------
# ![bono](https://raw.githubusercontent.com/datastax/graph-book/master/notebooks/images/logos/grem-4.png) Rozdział 4 
## Generowanie danych w celu badania sąsiedztw w środowisku roboczym
Autor notatnika: [Denise Gosnell](https://twitter.com/DeniseKGosnell)

Aby ułatwić tworzenie przykładów dla tej książki, opracowany przez nas proces generowania danych wykorzystuje pewną randomizację. Losowo przydziela np. transakcję do sprzedawcy.

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

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.

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

#### **&#9888;** Jeśli ponownie wykonasz proces wczytywania danych w notatniku, wyniki w lokalnym grafie *nie* będą identyczne jak wyniki wydrukowane w książce.
--------------------CELL_MARKDOWN_2--------------------
### Krok 1: Ponowne wczytanie danych z rozdziału 3., ponieważ wykorzystujemy ten model.

#### **&#9888;** Najpierw musisz utworzyć schemat korzystając z notatnika "Ch4_Neighborhoods_dev"

Kliknij oko w prawym rogu poniższej komórki, aby wyświetlić kod.
--------------------CELL_GREMLIN_3--------------------
// dodawanie Michaela
michael = g.addV('Customer').
            property('customer_id', "customer_0").
            property('name', "Michael").
            next();
                                
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();
          
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();

// dodawanie Marii
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();

// Dane Rashiki
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();
  
// Dane Jamiego
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();
  
// Dane 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_MARKDOWN_4--------------------
#### Szybkie sprawdzenie: upewnij się, że graf jest taki sam jak w rozdziale 3.
--------------------CELL_GREMLIN_5--------------------
dev.with("label-warning", false).V().bothE()
--------------------CELL_MARKDOWN_6--------------------
### Krok 2: Tworzenie nowych danych:
#### 2.a) Tworzenie transakcji płatności kartami kredytowymi u sprzedawców
Kliknij oko w prawym rogu poniższej komórki, aby przełączać wyświetlanie kodu; jest to długie pole.
--------------------CELL_GREMLIN_7--------------------
// Tworzenie transakcji płatności kartami kredytowymi u sprzedawców

// dodawanie 3 sprzedawców
nike = g.addV('Vendor').
          property('vendor_id', 0).
          property('vendor_name', "Nike").
          next();
amazon = g.addV('Vendor').
          property('vendor_id', 1).
          property('vendor_name', "Amazon").
          next();
target = g.addV('Vendor').
          property('vendor_id', 2).
          property('vendor_name', "Target").
          next();
vendors = [nike, amazon, target];

cc_17 = g.V().has("CreditCard","cc_num", "cc_17").
          next();
cc_32 = g.V().has("CreditCard","cc_num", "cc_32").
          next();
cards = [cc_17, cc_32];

// funkcja pomocnicza do formatowania znacznika czasu
def formatTimestamp(i){
    month = (i%12 + 1);
    if (month < 10){
        month = "0" + month.toString();
    }
    month = month.toString();
    num = (Math.random()*100).toInteger();
    day = (num%28 + 1);
    if (day < 10){
        day = "0" + day.toString();
    }
    day = day.toString();
    // formatowanie znacznika czasu zgodnie ze standardem ISO8601
    timestamp = "2020-" + month + "-" + day + "T01:00:00Z";
    return timestamp;
}

// metoda pomocnicza dodająca wierzchołki transakcji
def addTransactionVertex(transaction_id, timestamp){
    transaction = g.addV("Transaction").
                    property("transaction_id", transaction_id).
                    property("transaction_type", "unknown").
                    property("timestamp", timestamp).
                    next();
    return transaction;
}

// metoda pomocnicza addTransactionEdges
def addTransactionEdge(eLabel, fromV, toV){
    g.addE(eLabel).
      from(fromV).
      to(toV).
      next();
}

// dodawanie 100 transakcji między kartami kredytowymi a sprzedawcami
for(i=0; i<100; i++){
    transaction_id = i;
    
    // pobieranie losowych kart kredytowych i sprzedawców 
    Collections.shuffle(cards);
    Collections.shuffle(vendors);

    // formatowanie znacznika czasu do standardu ISO8601
    timestamp = formatTimestamp(i);
    
    // użycie metody do dodania wierzchołka transakcji
    transaction = addTransactionVertex(transaction_id, timestamp);
    
    // użycie metody do dodania krawędzi od wierzchołka transakcji do karty kredytowej
    addTransactionEdge("charge", transaction, cards[0]);

    // użycie metody do dodania krawędzi od wierzchołka transakcji do sprzedawcy
    addTransactionEdge("pay", transaction, vendors[0]);
}
--------------------CELL_MARKDOWN_8--------------------
#### Weryfikacja: 
1. Sprawdzenie czy mamy 3 wierzchołki <tt>Vendor</tt> 
2. Sprawdzenie czy mamy 100 wierzchołków <tt>Transaction</tt>  
3. Sprawdzenie czy mamy 100 krawędzi <tt>charge</tt>  
4. Sprawdzenie czy mamy 100 krawędzi <tt>pay</tt> 

--------------------CELL_GREMLIN_9--------------------
dev.V().hasLabel("Vendor").count()
--------------------CELL_GREMLIN_10--------------------
dev.V().hasLabel("Transaction").count()
--------------------CELL_GREMLIN_11--------------------
dev.E().hasLabel("charge").count()
--------------------CELL_GREMLIN_12--------------------
dev.E().hasLabel("pay").count()
--------------------CELL_MARKDOWN_13--------------------
### Step 2: Tworzenie nowych danych:
#### 2.b) Tworzenie miesięcznych płatności kartą kredytową i spłat kredytów
Kliknij oko w prawym rogu poniższej komórki, aby przełączać wyświetlanie kodu; jest to długie pole.
--------------------CELL_GREMLIN_14--------------------
// Tworzenie miesięcznych spłat kredytów

// tworzenie zmiennych ze stanem
michael_acct = g.V().has("Account","acct_id", "acct_14").next();
michael_loan = g.V().has("Loan", "loan_id", "loan_32").next();
rashika_acct = g.V().has("Account","acct_id", "acct_5").next();
jamie_acct = g.V().has("Account","acct_id", "acct_0").next();
jamie_loan0 = g.V().has("Loan", "loan_id", "loan_18").next();
jamie_loan1 = g.V().has("Loan", "loan_id", "loan_80").next();

// funkcja pomocnicza do formatowania znacznika czasu
def formatTimestamp(i){
    year = i%2;
    if (year < 1){
        year = "2020"
    }else{
        year = "2019"
    }
    month = (i%12 + 1);
    if (month < 10){
        month = "0" + month.toString();
    }
    month = month.toString();
    num = (Math.random()*100).toInteger();
    day = (num%28 + 1);
    if (day < 10){
        day = "0" + day.toString();
    }
    day = day.toString();
   // formatowanie znacznika czasu do standardu ISO8601 
    timestamp = year + "-" + month + "-" + day + "T01:00:00Z";
    return timestamp;
}

// metoda pomocnicza do dodawania wierzchołków transakcji
def addTransactionVertex(transaction_id, timestamp){
    transaction = g.addV("Transaction").
                    property("transaction_id", transaction_id).
                    property("transaction_type", "unknown").
                    property("timestamp", timestamp).
                    next();
    return transaction;
}

// metoda pomocnicza addTransactionEdges
def addTransactionEdge(eLabel, fromV, toV, timestamp){
    g.addE(eLabel).
      from(fromV).
      to(toV).
      next();
}

// dodawanie 2 lat miesięcznych spłat kredytu 
transaction_id = 101; // (w grafie jest już 100 transakcji

for(i=1; i < 25; i++){
// Część 1: spłaty kredytów Michaela
    // tworzenie nowej transakcji
    timestamp = formatTimestamp(i);
    transaction = addTransactionVertex(transaction_id, timestamp);

    // musimy dodać 1 do id transakcji, aby przygotować się do nowej transakcji
    transaction_id = transaction_id + 1;

    // dodajemy krawędzie od transakcji do konta za pomocą metody pomocniczej
    addTransactionEdge("withdraw_from", transaction, michael_acct, timestamp);

    // dodajemy krawędzie od transakcji do kredytu za pomocą metody pomocniczej
    addTransactionEdge("pay", transaction, michael_loan, timestamp);

// Część 2: paying Jamie's first loan
    // tworzenie nowej transakcji
    timestamp = formatTimestamp(i);
    transaction = addTransactionVertex(transaction_id, timestamp);
 
    // musimy dodać 1 do id transakcji, aby przygotować się do nowej transakcji
    transaction_id = transaction_id + 1;
 
    // dodajemy krawędzie od transakcji do konta za pomocą metody pomocniczej
    addTransactionEdge("withdraw_from", transaction, jamie_acct, timestamp);
    
    // dodajemy krawędzie od transakcji do kredytu za pomocą metody pomocniczej
    addTransactionEdge("pay", transaction, jamie_loan0, timestamp);

// Część 3: paying jamie's second loan
    // tworzenie nowej transakcji
    timestamp = formatTimestamp(i);
    transaction = addTransactionVertex(transaction_id, timestamp);

    // musimy dodać 1 do id transakcji, aby przygotować się do nowej transakcji
    transaction_id = transaction_id + 1;

    // dodajemy krawędzie od transakcji do konta za pomocą metody pomocniczej
    addTransactionEdge("withdraw_from", transaction, jamie_acct, timestamp);
    
    // dodajemy krawędzie od transakcji do kredytu za pomocą metody pomocniczej
    addTransactionEdge("pay", transaction, jamie_loan1, timestamp);
}
--------------------CELL_MARKDOWN_15--------------------
#### Weryfikacja: 
1. Sprawdzenie, czy mamy 172 wierzchołków <tt>Transaction</tt> (utworzyliśmy 72 nowych transakcji, a 100 mieliśmy wcześniej)
2. Sprawdzenie, czy mamy 72 krawędzi <tt>withdraw_from</tt> (3 zbiory 24 miesięcy spłat kredytu)
3. Sprawdzenie, czy mamy 72 przychodzące płatności kredytu (3 zbiory 24 miesięcy spłat kredytu)

--------------------CELL_GREMLIN_16--------------------
dev.V().hasLabel("Transaction").count()
--------------------CELL_GREMLIN_17--------------------
dev.E().hasLabel("withdraw_from").count()
--------------------CELL_GREMLIN_18--------------------
dev.V().hasLabel("Loan").inE("pay").count()
--------------------CELL_MARKDOWN_19--------------------
### Krok 2: Tworzenie nowych danych:
#### 2.c) Tworzenie płatności między kontami
--------------------CELL_GREMLIN_20--------------------
// Tworzenie płatności między kontami

// tworzenie zmiennych ze stanem
michael_acct = g.V().has("Account","acct_id", "acct_14").next();
rashika_acct = g.V().has("Account","acct_id", "acct_5").next();
jamie_acct = g.V().has("Account","acct_id", "acct_0").next();

accounts = [michael_acct, rashika_acct, jamie_acct];

// funkcja pomocnicza do formatowania znacznika czasu
def formatTimestamp(i){
    month = (i%12 + 1);
    if (month < 10){
        month = "0" + month.toString();
    }
    month = month.toString();
    num = (Math.random()*100).toInteger();
    day = (num%28 + 1);
    if (day < 10){
        day = "0" + day.toString();
    }
    day = day.toString();
    // format the timestamp with ISO8601 Standards
    timestamp = "2020-" + month + "-" + day + "T01:00:00Z";
    return timestamp;
}

// metoda pomocnicza do dodawania wierzchołków transakcji
def addTransactionVertex(transaction_id, timestamp){
    transaction = g.addV("Transaction").
                    property("transaction_id", transaction_id).
                    property("transaction_type", "unknown").
                    property("timestamp", timestamp).
                    next();
    return transaction;
}

// metoda pomocnicza addTransactionEdges
def addTransactionEdge(eLabel, fromV, toV){
    g.addE(eLabel).
      from(fromV).
      to(toV).
      next();
}

// dodawanie 100 płatności
transaction_id = 173;
for(i=0; i < 100; i++){
// wybieranie dwóch kont i dodanie transakcji między nimi
    Collections.shuffle(accounts);
    timestamp = formatTimestamp(i);
    transaction = addTransactionVertex(transaction_id, timestamp);
    // musimy dodać 1 do id transakcji, aby przygotować się do nowej transakcji
    transaction_id = transaction_id + 1;
    
    // dodajemy krawędzie do lub od transakcji za pomocą metody pomocniczej
    addTransactionEdge("withdraw_from", transaction, accounts[0]);
    addTransactionEdge("deposit_to", transaction, accounts[1]);
}
--------------------CELL_MARKDOWN_21--------------------
#### Weryfikacja: 
1. Sprawdzenie czy mamy 272 wierzchołków <tt>Transaction</tt> (utworzyliśmy 72 nowe transakcje, a wcześniej utworzyliśmy 100 transakcji)
2. Sprawdzenie czy mamy 100 krawędzi <tt>deposit_to</tt> (3 zbiory 24 miesięcy spłat kredytu)

--------------------CELL_GREMLIN_22--------------------
dev.V().hasLabel("Transaction").count()
--------------------CELL_GREMLIN_23--------------------
dev.E().hasLabel("deposit_to").count()
--------------------CELL_MARKDOWN_24--------------------
#### Koniec notatnika
