--------------------NOTEBOOK_Ch8_Paths_Development--------------------
--------------------CELL_MARKDOWN_1--------------------
# ![bono](https://raw.githubusercontent.com/datastax/graph-book/master/notebooks/images/logos/grem-8.png) Rozdział 8 
## Szukanie dróg w środowisku roboczym
Autor notatnika: [Denise Gosnell](https://twitter.com/DeniseKGosnell)

Szukanie dróg w danych grafowych jest następnym popularnym sposobem użycia technik grafowych po szukaniu sąsiedztw i nieograniczonych hierarchii. Ten notatnik tworzy schemat i prezentuje zapytania Gremlina przeszukujące drogi w sieci zaufania Bitcoina, w celu znalezienia odpowiedzi na podstawowe pytanie: jak bardzo musisz komuś ufać zanim wejdziesz z nim w interakcje?

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

**&#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): Analiza społeczności zaufania
#### [Krok 4](#step4): Zapytania wyszukujące najkrótsze drogi 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--------------------
Roboczy model danych dla rozdziału 8.:
![ch8_model](https://raw.githubusercontent.com/datastax/graph-book/master/notebooks/images/schema/ch8_schema.png "Schemat roboczy dla sieci bitcoinów.")
--------------------CELL_MARKDOWN_5--------------------
#### Tworzenie etykiet wierzchołków i krawędzi
--------------------CELL_GREMLIN_6--------------------
schema.vertexLabel("Address").
       ifNotExists().
       partitionBy('public_key', Text).
       create();
       
schema.edgeLabel('rated').
       ifNotExists().
       from('Address').
       to('Address').
       clusterBy('trust', Int, Desc).
       property('datetime', Text).
       create()
--------------------CELL_MARKDOWN_7--------------------
## <div id="step2"></div>Krok 2: Wstawianie danych
[Początek &#8593;](#topKey)
[Wstecz: Schemat &#x21b5;](#step1)
[Następne: Analiza społeczności zaufania &#x2193;](#step3)
--------------------CELL_MARKDOWN_8--------------------
#### 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 8. <tt>./ch8_load.sh</tt>
2. Uaktualnij ścieżki, aby wskazywały na poprawne katalogi w lokalnym środowisku
3. Uruchom skrypt: <tt>./ch8_load.sh</tt>
--------------------CELL_MARKDOWN_9--------------------
## <div id="step3"></div>Krok 3: Analiza społeczności zaufania
[Top &#8593;](#topKey)
[Wstecz: Wstawianie danych &#x21b5;](#step2)
[Następne: Zapytania wyszukujące najkrótsze drogi w Gremlinie &#x2193;](#step4)
--------------------CELL_MARKDOWN_10--------------------
#### Weryfikacja wczytanych danych: liczba wierzchołków i krawędzi
--------------------CELL_GREMLIN_11--------------------
dev.V().hasLabel("Address").count()
--------------------CELL_GREMLIN_12--------------------
dev.E().hasLabel("rated").count()
--------------------CELL_MARKDOWN_13--------------------
#### Podgraf społeczności zaufania dla adresu 1094
--------------------CELL_GREMLIN_14--------------------
dev.V().has("Address", "public_key", "1094").
    out("rated").
    outE("rated")
--------------------CELL_MARKDOWN_15--------------------
#### Zapytanie: Które adresy znajdują się w pierwszym sąsiedztwie?
--------------------CELL_GREMLIN_16--------------------
dev.V().has("Address", "public_key", "1094").
    out("rated").
    values("public_key")
--------------------CELL_MARKDOWN_17--------------------
#### Zapytanie: Które adresy znajdują się w drugim sąsiedztwie?
--------------------CELL_GREMLIN_18--------------------
dev.V().has("Address", "public_key", "1094").
    out("rated").
    out("rated").
    dedup().
    values("public_key")
--------------------CELL_MARKDOWN_19--------------------
#### Zapytanie: Które adresy znajdują się tylko w drugim sąsiedztwie?
--------------------CELL_GREMLIN_20--------------------
dev.V().has("Address", "public_key", "1094").aggregate("x").
    out("rated").aggregate("x").
    out("rated").
    dedup().
    where(without("x")).
    values("public_key")
--------------------CELL_MARKDOWN_21--------------------
#### Zapytanie: Wybór losowego adresu do użycia w przykładzie
--------------------CELL_GREMLIN_22--------------------
dev.V().has("Address", "public_key", "1094").as("start").
    out("rated").as("first_neighborhood").
    out("rated").
    dedup().
      where(neq("first_neighborhood")).
    values("public_key").
    sample(1)
--------------------CELL_MARKDOWN_23--------------------
## <div id="step4"></div>Krok 4: Zapytania wyszukujące najkrótsze drogi w Gremlinie 
[Początek &#8593;](#topKey)
[Wstecz: Analiza społeczności zaufania &#x21b5;](#step3)
--------------------CELL_MARKDOWN_24--------------------
#### Zapytanie: Ile dróg prowadzi do adresu 1337 z drugiego sąsiedztwa adresu 1094?
--------------------CELL_GREMLIN_25--------------------
dev.V().has("Address", "public_key", "1094").as("start").
        both("rated").
        both("rated").
        has("Address", "public_key", "1337").
        count()
--------------------CELL_MARKDOWN_26--------------------
#### Zapytanie: Które drogi z drugiego sąsiedztwa 1094 prowadzą do 1337? 
Prezentacja wyników według następujących kryteriów:
(1) odwiedzonych wierzchołków 
(2) długości drogi
--------------------CELL_GREMLIN_27--------------------
dev.V().has("Address", "public_key", "1094").
        both("rated").
        both("rated").
        has("Address", "public_key", "1337").
        path().
          by("public_key").as("traverser_path").
        count(local).as("total_vertices").
        select("traverser_path", "total_vertices")
--------------------CELL_MARKDOWN_28--------------------
#### Ile dróg do 1337 można znaleźć w trzecim sąsiedztwie?
--------------------CELL_GREMLIN_29--------------------
dev.V().has("Address", "public_key", "1094").
      repeat(out("rated")).
      times(3).
      has("Address", "public_key", "1337").
      path().
        by("public_key").as("traverser_path").
      count(local).as("total_vertices").
      select("traverser_path", "total_vertices")
--------------------CELL_MARKDOWN_30--------------------
#### Znajdowanie dróg dowolnej długości
**&#9888;** Poniższe pytanie będzie się wykonywać bardzo długo lub się nie skończy
--------------------CELL_GREMLIN_31--------------------
dev.V().has("Address", "public_key", "1094").
        repeat(out("rated")).
        until(has("Address", "public_key", "1337")).
        path().
          by("public_key").as("traverser_path").
        count(local).as("total_vertices").
        select("traverser_path", "total_vertices")
--------------------CELL_MARKDOWN_32--------------------
#### Aby sprawdzić, czy w zapytaniu znajduje się krok **barierowy**, sprawdź wynik kroku explain().
Uwaga: to zapytanie działa w programie gremlin-console ze stycznia 2019. Pracujemy nad wersją programu Studio, które zwróci wyniki tego zapytania.
--------------------CELL_GREMLIN_33--------------------
// dev.V().has("Address", "public_key", "1094").
//       repeat(out("rated")).
//       until(has("Address", "public_key", "1337")).
//       explain()

--------------------CELL_MARKDOWN_34--------------------
#### Znajdź najkrótszą drogę od 1094 do 1337.
--------------------CELL_GREMLIN_35--------------------
dev.V().has("Address", "public_key", "1094").as("start").
      repeat(out("rated")).
      until(has("Address", "public_key", "1337")).
      limit(1).
      path().
        by("public_key").as("traverser_path").
      count(local).as("total_vertices").
      select("traverser_path", "total_vertices")
--------------------CELL_MARKDOWN_36--------------------
#### Znajdź 15 najkrótszych dróg od 1094 do 1337
--------------------CELL_GREMLIN_37--------------------
dev.V().has("Address", "public_key", "1094").
      repeat(out("rated")).
      until(has("Address", "public_key", "1337")).
      limit(15).
      project("path_information", "total_vertices").
        by(path().by("public_key")).
        by(path().count(local).as("total_vertices"))
--------------------CELL_MARKDOWN_38--------------------
#### Znajdź 15 najkrótszych dróg od 1094 do 1337 i zsumuj ich wartości zaufania
--------------------CELL_GREMLIN_39--------------------
dev.withSack(0.0).
    V().
    has("Address", "public_key", "1094").as("start").
    repeat(outE("rated").
           sack(sum).
             by("trust").
           inV()).
    until(has("Address", "public_key", "1337")).
    limit(15).
    project("path_information", "vertices_plus_edges", "total_trust").
      by(path().by("public_key").by("trust")).
      by(path().count(local)).
      by(sack())
--------------------CELL_MARKDOWN_40--------------------
#### Znajdź 15 najkrótszych dróg od 1094 do 1337, zsumuj ich wartości zaufania i posortuj je
--------------------CELL_GREMLIN_41--------------------
dev.withSack(0.0).
    V().
    has("Address", "public_key", "1094").as("start").
    repeat(outE("rated").
           sack(sum).
             by("trust").
           inV()).
    until(has("Address", "public_key", "1337")).
    limit(15).
    order().
      by(sack(), decr).
    project("path_information", "vertices_plus_edges", "total_trust").
      by(path().by("public_key").by("trust")).
      by(path().count(local)).
      by(sack())
--------------------CELL_MARKDOWN_42--------------------
#### Znajdź 15 najkrótszych dróg od 1094 do 1337, **usuń cykliczne drogi**, zsumuj ich wartości zaufania i posortuj je
--------------------CELL_GREMLIN_43--------------------
dev.withSack(0.0).
    V().
    has("Address", "public_key", "1094").as("start").
    repeat(outE("rated").
           sack(sum).
             by("trust").
           inV().
           simplePath()). // usuwanie cykli
    until(has("Address", "public_key", "1337")).
    limit(15).
    order().
      by(sack(), decr).
    project("path_information", "vertices_plus_edges", "total_trust").
      by(path().by("public_key").by("trust")).
      by(path().count(local)).
      by(sack())
--------------------CELL_MARKDOWN_44--------------------
#### Koniec notatnika
[Top &#8593;](#topKey)

