Přejít k navigační liště

Zdroják » Databáze » Modelování dat v Neo4j – Metodika a obousměrné hrany

Modelování dat v Neo4j – Metodika a obousměrné hrany

Články Databáze

Přechod z relačního světa do světa grafů vyžaduje posun v uvažování a pohledu na data. I když grafy jsou často mnohem intuitivnější než tabulky, postřehl jsem stále opakující se chyby u lidí, kteří s modelováním grafů začínají. V tomto článku se podíváme na jednu z nejčastějších chyb – modelování obousměrných vztahů, a nakonec si ukážeme reálný příklad, ve kterém budeme nadále v seriálu pokračovat.

Jednosměrové vztahy

Vztahy v Neo4j musí být nějakého typu, který dává vztahu sémantický význam a také musí mít určený směr. Právě ten vyjadřuje smysl mezi entitami. Jinými slovy, vztah je nejednoznačný bez určení směru vztahu.

Například následující graf ukazuje, že Česká republika porazila (DEFEATED) Švédsko v ledním hokeji. Kdyby se směr vztahu obrátil, Švédové by byli mnohem šťastnější. Bez směru vůbec nevíme, kdo je vítězem, a proto je takový vztah nejednoznačný.

cz_se

Všimněte si, že z existence tohoto vztahu vyplývá vztah opačném směru, jak je ukázáno níže v dalším grafu. Jedná se o velmi častý případ. Ještě jednou si popíšeme na jiném příkladu, že film Pulp Fiction režíroval (DIRECTED) Quentin Tarantino znamená také, že Quentin Tarantino je režisérem (IS_DIRECTOR_OF) filmu Pulp Fiction. A tímto by mohlo dojít k velmi mnoho párovým vzhům.

cz_se2

Právě této chyby se lidé často dopouštějí při modelování grafu v Neo4j a vytváří obousměrné vztahy. Vzhledem k tomu, že jeden vztah vyjadřuje druhý (symetrická relace), je to nehospodárné jak z hlediska prostoru, tak z průchodu (traverzování) grafem. Neo4j umožňuje procházet vztahy v obou směrech, takzvaně i proti směru hrany. Navíc díky způsobu, jakým Neo4j data ukládá, nezávisí rychlost průchodu vztahem na jeho směru.

Obousměrné vztahy

Některé vztahy jsou přirozeně obousměrné. Klasickým příkladem je Facebook nebo vztah přátelství. Vztah je vzájemný – když s někým přátelíte, tak se on přátelí s vámi (možná tedy… ). V závislosti na tom, jak se díváme na model grafu, bychom o takovém vztahu mohli říci, že je obousměrný neboli neorientovaný.

Příkladem GraphAware a NeoTechnology jsou partnerské společnosti. Jelikož se jedná o vzájemný vztah, mohli bychom modelovat obousměrný neboli neorientovaný vztah.

neo_ga

Ale právě toto není možné v Neo4j – každý vztah musí mít počáteční a koncový uzel. Začátečníci se tak často uchylují k následujícímu modelu, který trpí přesně stejným problémem jako výše zmíněný model ledního hokeje s nadbytečným vztahem.

neo_ga2

Neo4j API umožňuje vývojářům zcela ignorovat směrovost vztahů při psaní dotazů, pokud si to přejí. Například v jazyce Cypher by vyhledání všech partnerských společností s NeoTechnology mohlo vypadat takto:

MATCH (neo)-[:PARTNER]-(partner)

Výsledek by byl stejný jako sloučení výsledků z těchto dvou různých dotazů:

MATCH (neo)-[:PARTNER]->(partner) and MATCH (neo)<-[:PARTNER]-(partner)

Proto je správný (nebo alespoň nejúčinnější) způsob modelování partnerských vztahů pomocí jediného PARTNER vztahu s určením libovolného směru.

neo_ga3

Shrnutí

Vztahy v Neo4j lze procházet v obou směrech se stejnou rychlostí. Navíc směrovost může být zcela ignorována. Z tohoto důvodu není třeba vytvářet dva různé vztahy mezi entitami, pokud mají hrany opačného směru stejný význam.

Metodika modelování grafové databáze

V následujících článcích si ukážeme návrh, implementaci a testování grafové databáze Neo4j na projektu BestPartyToday (jedná se celosvětový pártylist, který nabízí detailní statistiky k akcím). V současné době se v projektu používá databáze MySQL, která obsahuje desítky milionů záznamů, takže nás také čeká přesunutí dat z relačního databázového úložiště do grafového. Ovšem v dnešním příspěvku si pouze namodelujeme podobu grafové databáze z vybraných tabulek a atributů současné struktury MySQL databáze.

O konceptuálním návrhu grafové databáze se pojednává jako o tzv. whiteboard friendliness. Pro rychlé promítnutí všech myšlenek a postřehů, které byly vzneseny během návrhového brainstormingu, postačí pouze flipchart. Výsledný nákres je velmi jednoduché následně prezentovat ostatním projektovým skupinám (retail department, accound managers, sales managers atd.), které nemají technické vzdělání. Pochopení návrhu pro ně už není překážkou, jelikož nákres je možné jednoduše přizpůsobit do podoby reálného života.

Realizace konceptuálního modelu

png;base644cf7e065ee432c6b

Na fotografii finálního návrhu grafové databáze pro projekt BestPartyToday je využito pěti nejvýznamnějších tabulek současné relační databáze, které jsou reprezentovány ikonami znázorňující nodes a směrovými šipkami prorelationships. Skrze entity (nodes a relationships) budeme procházet graf a získávat požadovaná data, která budou zpracována a zobrazena uživateli aplikace. Jejich význam je popsán níže v tabulce Přehled entit grafového modelu.

Přehled entit grafového modelu

TABULKA RELAČNÍ DATABÁZE

ENTITA GRAFOVÉ DATABÁZE

VÝZNAM

users

node člověk

uživatel

friends

relationship KNOWS

vztah vyjadřující přátelství

events

node budova

akce

events_of_users

relationship INVITED

vztah vyjadřující typ účasti na akci

likes

node stránka se znakem P

stránka na Facebooku

likes

relationship LIKES

vztah vyjadřující like stránky

Článek vyššel na základě spolupráce Jaroslava Ramby s Michalem Bachmanem. Více na http://graphaware.com a http://neo4j.cz.

Zdroje:

EIFREM, E. (2012). Introduction to Neo4j http://www.youtube.com/watch?v=tyNWT85Z0mc

Komentáře

Subscribe
Upozornit na
guest
7 Komentářů
Nejstarší
Nejnovější Most Voted
Inline Feedbacks
View all comments
Jozef

Neslo by trocha zrychlit ten serial? Nemozem sa dockat dalsich casti…

Vit Hnilica

V prikladu je jako zacatecnicka chyba spojeni dvou firem dvema vazbama partner. Kdyz jsem si chtel vyzkouset neo4j, tak jsem narazil na to, ze takoveto vazby potrebuju (nekde jsou jednosmerne silnice a nekde jen jednosmerky). Ale prijde mi ze ta konzole s tim moc nepocita a zobrazuje ty cesty pres sebe coz je docela neprehledny.

Vit Hnilica

(trosku jsem se uklikl, nemela to byt odpoved na komentar ale reakce na clanek)

David

Ty hrany grafu se nedaji ohodnotit? Opravdu musi byt mezi dvema uzly vice hran (pochopil bych to kdyby bylo vice hran mezi dvemi uzly ruzne ohodnocenych).

Michal Bachman

Pokud jde o jednosmerne silnice, jednosmerky, nebo treba i o situaci, kdy vztah v jednom smeru ma jinou kvalitu, nez vztah ve smeru opacnem, pak je samozrejme naprosto v poradku mit vztahy dva.

Priklad:
(Vit Hnilica)-[:LOVES {level:5}]->(nejaka slecna)
(nejaka slecna)-[:LOVES {level:3}]->(Vit Hnilica)

Jinymi slovy, musis jeste trochu zapracovat, aby k Tobe mela slejne sympatie, jako ty k ni :-) V tom pripade 2 vztahy naprosto OK.

Co se te konzole tyce, to je bohuzel pravda. Existuji i jine (napr. linkurio.us), bohuzel uz ne zdarma…

Vit Hnilica

dobrej priklad, diky.
ja jsem chtel napsat obousmerne silnice a jednosmerky, ale asi bylo pochopeno:)

martin_katrenik

Free ebook od O’Reilly graphdatabases.com

Enum a statická analýza kódu

Mám jednu univerzální radu pro začínající programátorty. V učení sice neexistují rychlé zkratky, ovšem tuhle radu můžete snadno začít používat a zrychlit tak tempo učení. Tou tajemnou ingrediencí je statická analýza kódu. Ukážeme si to na příkladu enum.