Anwendungsbeispiel
ein soziales Netzwerk
in relationaler Datenbank
- typischerweise zwei Tabellen für Daten und Relationen
direkte Freunde eines Benutzers
select distinct uf.* from t_user_friend uf where
uf.user_1 = ?
Freunde von Freunden eine Benutzers
select distinct uf2.* from t_user_friend uf1 inner
join t_user_friend uf2 on uf1.user_1 = uf2.user_2 where
uf1.user_1 = ?
Freunde von Freunden von Freunden eine Benutzers
select distinct uf3.* from t_user_friend uf1 inner
join t_user_friend uf2 on uf1.user_1 = uf2.user_2 inner join
t_user_friend uf3 on uf2.user_1 = uf3.user_2 where uf1.user_1 = ?
- JOIN-Operation pro Ebene
- bei großen Graphenstrukturen potentielle
Performance-Probleme
in Neo4j Graphdatenbank
- speichert Daten als Nodes und Relationships
- User als Nodes, Freundschaft als Relationship zwischen
User-Nodes
direkte Freunde eines Benutzers
START me=node:Users(name = 'me' MATCH
me-[:KNOWS]->friends RETURN friends
Freunde von Freunden eine Benutzers
START me=node:Users(name = 'me') MATCH
me-[:KNOWS]->friend-[:KNOWS]->friend2 WHERE
not(me-[:KNOWS]-friend2) RETURN DISTINCT friend2 ORDER BY
friend2.name"
Freunde von Freunden von Freunden eine Benutzers
START me=node:Users(name = 'me') MATCH
me-[:KNOWS]->friend-[:KNOWS]->friend2-[:KNOWS]->friend3 RETURN
DISTINCT friend3 ORDER BY friend3.name
Alternativ: Graph-Traversals
- mächtige und effiziente API zur Abfrage Graphen-basierte
Daten
- fundamentale Operation: Durchlaufe eine Menge von Nodes,
folge den definierten Relationships, während die Kriterien
erfüllt sind
TraversalDescription traversalDescription =
Traversal.description().relationships(“IS_FRIEND_OF”,Direction.OUTGOING)
.evaluator(Evaluators.atDepth(2))
.uniqueness(Uniqueness.NODE_GLOBAL); Iterable nodes =
traversalDescription.traverse(nodeById).nodes();
Welcher Freund mag was?
START me=node:Users(name = 'me') MATCH
me-[:KNOWS]->friends-[:LIKES]->websites RETURN websites.url,
friends
Was wird am meisten von meinen Freunden gemocht?
START me=node:Users(name = 'me') MATCH
me-[:KNOWS]->friends-[:LIKES]->websites RETURN websites.url,
COUNT(*) ORDER BY COUNT(*) DESC