--------------------NOTEBOOK_Ch6_Trees_Development--------------------
--------------------CELL_MARKDOWN_1--------------------
# ![bono](https://raw.githubusercontent.com/datastax/graph-book/master/notebooks/images/logos/grem-6.png) Rozdział 6 
## Używanie drzew w środowisku roboczym
Autor notatnika: [Denise Gosnell](https://twitter.com/DeniseKGosnell)

Skupimy się teraz na myśleniu grafowym w odniesieniu do danych hierarchicznych. Dane hierarchiczne reprezentują koncepcje, które naturalnie organizują się w zagnieżdżoną strukturę zależności.

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

**&#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): Zapytania Gremlina: od liści do korzeni (lub: z dołu na górę)
#### [Krok 4](#step4): Zapytania Gremlina: od korzeni do liści (lub: z góry na dół)
--------------------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--------------------
Roboczy model danych dla rozdziału 6.:
![ch6_model](https://raw.githubusercontent.com/datastax/graph-book/master/notebooks/images/schema/ch6_schema.png "Schemat roboczy dla przykładu sieci czujników.")
--------------------CELL_MARKDOWN_5--------------------
#### Tworzenie etykiet wierzchołków
--------------------CELL_GREMLIN_6--------------------
schema.vertexLabel('Sensor').
       ifNotExists().
       partitionBy('sensor_name', Text).
       property('latitude', Double).
       property('longitude', Double).
       property('coordinates', Point).
       create();

schema.vertexLabel('Tower').
       ifNotExists().
       partitionBy('tower_name', Text).
       property('latitude', Double).
       property('longitude', Double).
       property('coordinates', Point).
       create();
--------------------CELL_MARKDOWN_7--------------------
#### Tworzenie etykiet krawędzi
--------------------CELL_GREMLIN_8--------------------
schema.edgeLabel('send').
       ifNotExists().
       from('Sensor').
       to('Sensor').
       create()

schema.edgeLabel('send').
       ifNotExists().
       from('Sensor').
       to('Tower').
       create()

--------------------CELL_MARKDOWN_9--------------------
## <div id="step2"></div>Krok 2: Wstawianie danych
[Początek &#8593;](#topKey)
[Wstecz: Schema &#x21b5;](#step1)
[Następne: Zapytania Gremlina: od liści do korzeni (lub: z dołu na górę) &#x2193;](#step3)
--------------------CELL_MARKDOWN_10--------------------
#### 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 6. <tt>./ch6_load.sh</tt>
2. Uaktualnij ścieżki, aby wskazywały na poprawne katalogi w lokalnym środowisku
3. Uruchom skrypt: <tt>./ch6_load.sh</tt>
--------------------CELL_MARKDOWN_11--------------------
## <div id="step3"></div>Krok 3: Zapytania Gremlina: od liści do korzeni
[Początek &#8593;](#topKey)
[Wstecz: Wstawianie danych &#x21b5;](#step2)
[Następne: Zapytania Gremlina: od korzeni do liści (lub: z góry na dół) &#x2193;](#step4)
--------------------CELL_MARKDOWN_12--------------------
#### Zapytanie: Dokąd wysłał dane określony czujnik?
--------------------CELL_GREMLIN_13--------------------
sensor = dev.V().has("Sensor", "sensor_name", "1002688"). // szukamy czujnika
                 next()                  // zwracamy wierzchołek czujnika
dev.V(sensor).                           // szukamy czujnika
    out("send").                         // przechodzimy przez wszystkie krawędzie send
    project("Label", "Name").            // dla każdego wierzchołka tworzymy mapę z dwoma kluczami
      by(label()).                       // wartość pierwszego klucza 
      by(coalesce(values("tower_name"),  // jeśli wierzchołek jest wieżą, zwracamy tower_name
                  values("sensor_name")))// w przeciwnym razie zwracamy wartość parametru sensor_name 
--------------------CELL_MARKDOWN_14--------------------
#### Zapytanie: Analiza drugiego sąsiedztwa czujnika.

--------------------CELL_GREMLIN_15--------------------
sensor = dev.V().has("Sensor", "sensor_name", "1002688"). // szukamy czujnika
                 next()            // zwracamy wierzchołek czujnika
                 
dev.V(sensor).                     // szukamy czujnika
    out("send").                   // przechodzimy do wszystkich wierzchołków z pierwszego sąsiedztwa
    out("send").                   // przechodzimy do wszystkich wierzchołków z drugiego sąsiedztwa
    project("Label", "Name").             // dla każdego wierzchołka tworzymy mapę z dwoma kluczami  
      by(label()).                        // wartością pierwszego klucza jest etykieta
      by(coalesce(values("tower_name"),   // jeśli jest to wieża, zwracamy właściwość tower_name 
                  values("sensor_name"))) // w przeciwnym razie zwracamy właściwość sensor_name
--------------------CELL_MARKDOWN_16--------------------
#### Zapytanie: Analiza trzeciego sąsiedztwa czujnika.

--------------------CELL_GREMLIN_17--------------------
sensor = dev.V().has("Sensor", "sensor_name", "1002688"). // szukamy czujnika
                 next()                  // zwracamy wierzchołek czujnika
                 
dev.V(sensor).                     // szukamy czujnika
    out("send").                   // przechodzimy do wszystkich wierzchołków z pierwszego sąsiedztwa
    out("send").                   // przechodzimy do wszystkich wierzchołków z drugiego sąsiedztwa
    out("send").                   // przechodzimy do wszystkich wierzchołków z trzeciego sąsiedztwa
    project("Label", "Name").             // dla każdego wierzchołka tworzymy mapę z dwoma kluczami
      by(label()).                        // wartością pierwszego klucza jest etykieta
      by(coalesce(values("tower_name"),   // jeśli jest to wieża, zwracamy właściwość tower_name
                  values("sensor_name"))) // w przeciwnym razie zwracamy właściwość sensor_name
--------------------CELL_MARKDOWN_18--------------------
#### Zapytanie: Jaka jest droga od tego czujnika do dowolnej wieży?

**&#9888;** Poniższe zapytanie będzie się długo wykonywać lub może się nie skończyć.
--------------------CELL_GREMLIN_19--------------------
sensor = dev.V().has("Sensor", "sensor_name", "1002688").
                 next()    

dev.V(sensor).                // szukamy czujnika
    until(hasLabel("Tower")). // aż osiągniemy wieżę 
    repeat(out("send"))       // kontynuujemy przechodzenie przez krawędź send na zewnątrz 

--------------------CELL_MARKDOWN_20--------------------
#### Zapytanie: Jaka jest droga od tego czujnika do dowolnej wieży? (usuwanie cykli)
--------------------CELL_GREMLIN_21--------------------
sensor = dev.V().has("Sensor", "sensor_name", "1002688").
                 next()    

dev.V(sensor).                // szukamy czujnika
    until(hasLabel("Tower")). // aż osiągniemy wieżę
    repeat(out("send").       // przechodzimy dalej przez krawędzie send
           simplePath())      // usuwa cykle 

--------------------CELL_MARKDOWN_22--------------------
#### Zapytanie: Jaka jest droga od tego czujnika do dowolnej wieży? (usuwanie cykli, formowanie wyników)
--------------------CELL_GREMLIN_23--------------------
sensor = dev.V().has("Sensor", "sensor_name", "1002688"). 
                 next()      
dev.V(sensor).                // szukamy czujnika
    until(hasLabel("Tower")). // aż osiągniemy wieżę
    repeat(out("send").       // przechodzimy dalej przez krawędzie send
           simplePath()).     // usuwa cykle 
    path().     // wszystkie obiekty są wieżami; pobieramy całą historię
       by(coalesce(values("tower_name"),   // wartość jeśli wierzchołek w ścieżce jest wieżą 
                   values("sensor_name")))  // w przeciwnym razie wartość z wierzchołka czujnika
--------------------CELL_MARKDOWN_24--------------------
#### Przypisujemy etykiety do danych drogi
--------------------CELL_GREMLIN_25--------------------
sensor = dev.V().has("Sensor", "sensor_name", "1002688"). 
                 next()      
dev.V(sensor).                 // szukamy czujnika
      as("start").
    until(hasLabel("Tower")). // aż osiągniemy wieżę
    repeat(out("send").       // kprzechodzimy dalej przez krawędzie send
             as("visited").
           simplePath()).     // usuwa cykle
    as("tower").
    path().     // wszystkie obiekty są wieżami; pobieramy całą historię
       by(coalesce(values("tower_name"),   // wartość jeśli wierzchołek w ścieżce jest wieżą 
                   values("sensor_name"))) // w przeciwnym razie wartość z wierzchołka czujnika
--------------------CELL_MARKDOWN_26--------------------
## <div id="step4"></div>Krok 4: Zapytania Gremlina: od korzeni do liści (lub: z góry na dół)
[Początek &#8593;](#topKey)
[Wstecz: Zapytania Gremlina: od liści do korzeni &#x21b5;](#step3)

--------------------CELL_MARKDOWN_27--------------------
##### Konfiguracja zapytania: Z którą wieżą połączonych jest najwięcej czujników, aby można ją było wykorzystać w przykładzie?
--------------------CELL_GREMLIN_28--------------------
dev.V().hasLabel("Tower").          // dla wszystkich wież 
        group("degreeDistribution").// tworzymy obiekt mapy
          by(values("tower_name")). // kluczem mapy jest tower_name
          by(__.inE("send").count()). // wartością każdego elementu jest jego stopień
        cap("degreeDistribution").  // krok barierowy w Gremlinie służący do wypełnienia mapy
        order(Scope.local).         // sortowanie elementów w obiekcie mapy
          by(values, Order.desc)    // według wartości w kolejności malejącej
--------------------CELL_MARKDOWN_29--------------------
#### Zapytanie: Które czujniki są połączone bezpośrednio z wieżą Georgetown?
--------------------CELL_GREMLIN_30--------------------
tower = dev.V().has("Tower", "tower_name", "Georgetown").next() // pobieramy wieżę Georgetown 
dev.V(tower).                    // zaczynamy przeszukiwanie od wieży Georgetown
    in("send").                  // przechodzimy do połączonych z nią czujników 
    project("Label", "Name").    // tworzymy mapę z dwoma kluczami 
      by(label()).               // z wartościami dla klucza "Label" 
      by(values("sensor_name"))  // z wartościami dla klucza "Name"
--------------------CELL_MARKDOWN_31--------------------
#### Zapytanie: Szukanie wszystkich czujników połączonych z wieżą Georgetown (pierwsza próba)
--------------------CELL_MARKDOWN_32--------------------
 W Groovy in() jest słowem zarezerwowanym, dlatego trzeba je poprzedzić __.
--------------------CELL_GREMLIN_33--------------------
tower = dev.V().has("Tower", "tower_name", "Georgetown").next() // pobieramy wieżę Georgetown 
dev.V(tower).               // zaczynamy przechodzenie od wieży
    until(hasLabel("Sensor")). // aż dotrzemy do czujnika
    repeat(__.in("send").      // kontynuujemy przechodzenie na zewnątrz krawędzi send
           simplePath())       // usuwamy cykle
--------------------CELL_MARKDOWN_34--------------------
#### Zapytanie: Szukanie wszystkich czujników połączonych z wieżą Georgetown (druga próba)

**&#9888;** Poniższe zapytanie przestanie się wykonywać po 30 sekundach. Aby je zakończyć kliknij **Kill Session**.
--------------------CELL_GREMLIN_35--------------------
tower = dev.V().has("Tower", "tower_name", "Georgetown").next() // pobieramy wieżę Georgetown
dev.V(tower).                  // zaczynamy przechodzenie od wieży
    repeat(__.in("send").      // kontynuujemy przechodzenie na zewnątrz krawędzi send
           simplePath())       // usuwamy cykle
--------------------CELL_MARKDOWN_36--------------------
#### Reduce Scope: Szukanie wszystkich czujników połączonych z wieżą Georgetown z wykorzystaniem trzech połączeń
--------------------CELL_GREMLIN_37--------------------
tower = dev.V().has("Tower", "tower_name", "Georgetown").next() // pobieramy wieżę Georgetown

dev.V(tower).             // zaczynamy przechodzenie od wieży
    repeat(__.in("send"). // kontynuujemy przechodzenie na zewnątrz krawędzi send
           simplePath()). // usuwamy cykle
    times(3).             // powtarzamy tylko 3 razy
    path().               // pobieramy drogę
      by(coalesce(values("tower_name"),   // zwracamy tower_name jeśli jest to wieża
                  values("sensor_name"))) // w przeciwnym razie zwracamy sensor_name
--------------------CELL_MARKDOWN_38--------------------
### Koniec notatnika
[Początek &#8593;](#topKey)
