Pierwsze rysowanki - E to Graf jest

Hehe powrót do przedszkola normalnie. Ale ten feature jest zajebisty :) ktoś za to powinien d

Hehe powrót do przedszkola normalnie. Ale ten feature jest zajebisty :) ktoś za to powinien dostać 1mln$. Gdyby nie taka wizualizacja to pewnie długo bym siedział przy SQL i jazda jak exel.

Na grafach znam się tyle co teoria w 2 linijkach na sprawdzianie. Natomiast ostatnio podczas rg-dev w Rzeszowie była prelekcja Szymona Warda @maklipsa dotycząca grafów. Fajnie wszystko opowiedział, i widać z pasją i zaangażowaniem, ale z przyczyn filipińskich i późnej pozy to miałem content w głowie ale microservice od analizy informacji już leżał. Jedyne co zwrócił mi. :)

Cola + Ryba => "Cooo...????"

I tak po 2 dniach serwis wstał i zwraca: że te grafy to są błeee, bo gdzie tu not Nulle, gdzie tu spójność, biznes w to z trudem bo do exela będzie trudno. Nie mija 5 min i w tej czasce zaświeciła się lampka: "Przecież to jest jak mapa połączeń". Ha odkrywcze nie ? Normalnie geniusz. W definicji tak pisze. "Ale nieee, nieee, nie ze same połączenia, to jest baza danych gość mówił. To normalnie się JE, to jakiś ma język zapytań na 5 piętrze. To to będzie dobre bo to da się zrobić inaczej joiny.".

No i właśnie do roboty. Szymon mówił o jakimś silniku jak rybka. Neo.... Neo4j. https://neo4j.com/ 
Powiem tyle. Jest ZajeEEEEEE ty, przez tą wizualizację. To nie to co Młotek do sql'a. aż się chce wpisywać Match (s) return s.  Normalnie byle by RAM w chromie starczył bo jednak przy wielu elementach można sobie zaszkodzić.

Import danych   

https://neo4j.com/developer/guide-import-csv/  
https://neo4j.com/developer/guide-importing-data-and-etl/

Przecież z marszu nie będziemy robić mam jakieś dane odnośnie komunikacji to sobie z SQL wyciągnę. Ale tu jest haczyk. Jak 5 lat romantycznie spędzałeś z SQL, tak teraz ciężko obrobić dwie kochanki i najlepiej całe "żarcie"(dane) dla nowej zrobił byś w kuchni starej dziewczyny. Ehh Ale dobre porównanie, dosłowne. Pierwsze co to zamiast importować to zaczynają się triki, a to może zrobię 2,3..8 joinów 7 subSelect i jazda. GŁUPOTA!

Nowa kochanka to też silnik bazodanowy, mając dane 1:1 w strukturze sql-csv, wystarczy nauczyć rozmawiać w nowym języku.

Pierwszy najważniejszy skrypt: 

MATCH (n) DETACH
DELETE n;

Trudno się nie domyślić, jest najlepszy bo za każdym razem puszczamy go ostatni raz. :)

Ale dobra importujemy jeden label(to te kropki-ala tabela po staremu), drugi. - Odcinki drogi (Segment), Przystanki/Punkty docelowe (Pointy)

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///Segment.csv" AS row
CREATE (:Segment {lineNo: toInt(row.lineNo) ,speedLimit: toInt(row.speedLimit),relationSort: toInt(row.relationSort) ,kmFrom :  toFloat(row.kmFrom),kmTo : toFloat(row.kmTo)});

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///point.csv" AS row
CREATE (:Point {name: row.nazwa   });

O ile Segmenty są maja swoją kolejność i można bardzo łatwo połączyć w jedną linie. A tak naprawdę dla każdej linii można było by zrobić label.

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///tracks2.csv" AS row
MATCH (sta:Segment {lineNo: toInt(row.lineNo),relationSort: toInt(row.relationSort)})
MATCH (stc:Segment {lineNo: sta.lineNo,relationSort: (sta.relationSort+1)})
MERGE (sta)-[:Continue]-(stc);

Ale to to pikuś, problemem w SQL było napisanie takiego skryptu aby segmenty połączyć z Poitami. Udało mi się z innych źródeł złapać informacje jaki Pint(nazwa) na jakim jest km linii(lineNo), i od tego momentu to byłą bajka w połączeniu(ten pierwszy skrypt uruchomiłem 30 razy i taki poszło):

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///pointLocation.csv" AS row
MATCH (p:Point {name: row.nazwa })
MATCH (stc:Segment {lineNo: toInt(row.nr_lini)})
Where toInt(row.km_os) >= toInt(stc.kmFrom) and (toInt(stc.kmTo) >  toInt(row.km_os) or toInt(row.km_os) = toInt(stc.kmTo))
MERGE (p)-[:Stay { km: toFloat(row.km_os),  lineNo: toInt(row.nr_lini) }]-(stc);

import.done.pl

Znajdź najkrótszą ścieżkę i do domu

Magiczna komenda jaką daje nam silnik i pozamiatane. Nie no co wy, zwróci nam najkrótszą drogę ale po ilości relacji.

MATCH (s:Point),(e:Point),
p = shortestpath((s)-[*]-(e))
WHERE s.name = 'JASŁO' AND e.name = 'RZESZÓW'
return p

Reszta suuuun. bo dziś Dzień kobiet więc "Panowie Zdrowie Pań". BACZNOŚĆ DO OBOWIĄZKÓW.
Panie: Wszystkiego najlepszego.