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

Najczęściej analizując drogi sprawdzamy ile krawędzi trzeba przejść od początku do końca. Tym zajmowaliśmy się w rozdziale 8.

Następną koncepcją dotyczącą analizy dróg za pomocą grafów jest wykorzystanie idei "odległości". W tym celu dodajemy wagę lub koszt do drogi. Jest to problem drogi najniższego kosztu lub najkrótszej drogi ważonej. Ten rozdział i notatnik prezentują rozwiązywanie problemu najkrótszej drogi ważonej w środowisku 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): Analiza dróg ważonych za pomocą punktacji znormalizowanej
#### [Krok 4](#step4): Zapytania dotyczące najkrótszej drogi ważonej 
--------------------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  9.:
![ch9_model](https://raw.githubusercontent.com/datastax/graph-book/master/notebooks/images/schema/ch9_schema.png "Schemat produkcyjny 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('norm_trust', Double, Asc).
       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 dróg ważonych za pomocą punktacji znormalizowanej &#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 9. <tt>./ch9_load.sh</tt>
2. Uaktualnij ścieżki, aby wskazywały na poprawne katalogi w lokalnym środowisku
3. Uruchom skrypt: <tt>./ch9_load.sh</tt>
--------------------CELL_MARKDOWN_9--------------------
## <div id="step3"></div>Krok 3: Analiza dróg ważonych za pomocą punktacji znormalizowanej 
[Początek &#8593;](#topKey)
[Wstecz: Wstawianie danych &#x21b5;](#step2)
[Następne: Zapytania dotyczące najkrótszej drogi ważonej &#x2193;](#step4)

--------------------CELL_MARKDOWN_10--------------------
#### Zapytanie: Znajdź wszystkie drogi o długości równej 2, posortowane według całkowitego zaufania
--------------------CELL_GREMLIN_11--------------------
g.withSack(0.0).
  V().has("Address", "public_key", "1094").
  repeat(outE("rated").
        sack(sum).
          by("norm_trust").
        inV()).
  times(2).
  has("Address", "public_key", "1337").
  order().
    by(sack(), asc).
  project("path_information", "total_elements", "trust_distance").
    by(path().by("public_key").by("norm_trust")).
    by(path().count(local)).
    by(sack())
--------------------CELL_MARKDOWN_12--------------------
#### Zapytanie: Znajdź 15 najkrótszych dróg pod względem długości, posortowanych według całkowitego zaufania
--------------------CELL_GREMLIN_13--------------------
g.withSack(0.0).
  V().has("Address", "public_key", "1094").
  repeat(outE("rated").
         sack(sum).
           by("norm_trust").
         inV().
         simplePath()).
  until(has("Address", "public_key", "1337")).
  limit(15).
  order().
    by(sack(), asc).
  project("path_information", "total_elements", "trust_distance").
    by(path().by("public_key").by("norm_trust")).
    by(path().count(local)).
    by(sack())
--------------------CELL_MARKDOWN_14--------------------
## <div id="step4"></div>Krok 4: Zapytania dotyczące najkrótszej drogi ważonej
[Początek &#8593;](#topKey)
[Wstecz: Analiza dróg ważonych za pomocą punktacji znormalizowanej &#x21b5;](#step3)
--------------------CELL_MARKDOWN_15--------------------
Proces, który tworzymy implementuje optymalizacje opisane w tekście: optymalizacje najniższego kosztu, globalne heurystyki i unikanie superwęzłów. Służy do tego pięć następujących kroków:

1. Zamień dwa kroki i zmień limity
2. Dodaj obiekt rejestrujący najkrótszą drogę ważoną do odwiedzonego wierzchołka
3. Usuń przejście, jeśli jego droga do jego wierzchołka jest dłuższa niż już wykryta
4. Usuń przejście, jeśli jego droga do docelowego wierzchołka jest dłuższa niż już wykryta
5. Usuń przejście z niestandardowych przyczyn, na przykład w celu usunięcia superwęzłów

Wszystkie kroki są zaprezentowane w pięciu następnych zapytaniach. 
--------------------CELL_MARKDOWN_16--------------------
#### 1) Zamień dwa kroki i zmień limity 
**&#9888;** NIE URUCHAMIAJ! To zapytanie znajduje wszystkie drogi
--------------------CELL_MARKDOWN_17--------------------
        A  g.withSack(0.0).
        B     V().has("Address", "public_key", "1094").
        C     repeat(
        D,E,F      outE("rated").sack(sum).by("norm_trust").inV().
        G          simplePath()
        H     ).until(has("Address", "public_key", "1337")).
        O1    order().
                by(sack(), incr).
        O1    limit(1).
        K     project("path_information", "total_elements", "trust_distance").
                by(path().by("public_key").by("norm_trust")).
                by(path().count(local)).
                by(sack())
--------------------CELL_MARKDOWN_18--------------------
#### 2) Dodaj obiekt rejestrujący najkrótszą drogę ważoną do odwiedzonego wierzchołka
**&#9888;** NIE URUCHAMIAJ! To zapytanie znajduje wszystkie drogi
--------------------CELL_MARKDOWN_19--------------------
        A  g.withSack(0.0).
        B     V().has("Address", "public_key", "1094").
        C     repeat(
        D,E,F      outE("rated").sack(sum).by("norm_trust").inV().
        G          simplePath().
        O2         group("minDist").    // tworzenie mapy
                      by().             // kluczami są wierzchołki
                      by(sack().min())  // wartościami są minimalne odległości
        H     ).until(has("Address", "public_key", "1337")).
        O1    order().
                by(sack(), incr).
        O1    limit(1).
        K     project("path_information", "total_elements", "trust_distance").
                by(path().by("public_key").by("norm_trust")).
                by(path().count(local)).
                by(sack())
--------------------CELL_MARKDOWN_20--------------------
#### 3) Usuń przejście, jeśli jego droga do jego wierzchołka jest dłuższa niż już wykryta
--------------------CELL_GREMLIN_21--------------------
g.withSack(0.0).
  V().has("Address", "public_key", "1094").
  repeat(outE("rated").
         sack(sum).
           by("norm_trust").
         inV().
           as("visited"). // label will be used in the map lookup below: select(select("visited"))
         simplePath().
         group("minDist").
           by().
           by(sack().min()).
         filter(project("a","b").   // za pomocą wzorca project/where w Gremlinie utwórz test wartości boolean
                  by(select("minDist").         // a: dostęp do "minDist"
                     select(select("visited"))).// pobieramy minDist do bieżącego wierzchołka v
                  by(sack()).       // b: odległość przejścia do bieżącego wierzchołka v
                where("a",eq("b"))) // test: czy a jest równe b?
     ).until(has("Address", "public_key", "1337")).
    order().
        by(sack(), asc).
    limit(1).
     project("path_information", "total_elements", "trust_distance").
        by(path().by("public_key").by("norm_trust")).
        by(path().count(local)).
        by(sack())
--------------------CELL_MARKDOWN_22--------------------
#### Zapytanie konfiguracyjne: Zrozumienie rozkładu stopnia grafu
--------------------CELL_GREMLIN_23--------------------
g.V().groupCount().by(outE().count())
--------------------CELL_MARKDOWN_24--------------------
#### 4) Usuń przejście z niestandardowych przyczyn, na przykład w celu usunięcia superwęzłów
--------------------CELL_GREMLIN_25--------------------
max_outgoing_edges = 100;
max_allowed_weight = 1.0;

g.withSack(0.0).
      V().has("Address", "public_key", "1094").
      repeat(
        outE("rated").sack(sum).by("norm_trust").inV().as("visited").
        simplePath().
        group("minDist").       
              by().             
              by(sack().min()).  
        and(project("a","b").   
                  by(select("minDist").select(select("visited"))).
                  by(sack()).      
               where("a",eq("b")), 
            filter(sideEffect(outE("rated").count().is(gt(max_outgoing_edges)))), // heurystyka 1.: unikanie superwęzłów
            filter(sack().is(lt(max_allowed_weight))))                            // heurystyka 2.: maksymalna dozwolona waga
      ).until(has("Address", "public_key", "1337")).
      order().
        by(sack(), asc).
      limit(1).
      project("path_object", "total_elements", "trust_distance").
        by(path().by("public_key").by("norm_trust")).
        by(path().count(local)).
        by(sack())
--------------------CELL_MARKDOWN_26--------------------
#### Koniec notatnika
[Top &#8593;](#topKey)
