[Oracle] Wer kennt wen über wen? Pfade in einem Graph auflisten
Hallo und herzlich willkommen! Tutorials.de ist eine Hilfe-Community mit dem Motto User helfen Usern. Als Gast verfügst Du über Schreibrechte in unseren Foren und Blogs. Du kannst dich aber gerne auch kostenlos registrieren und Teil unserer Gemeinschaft werden! Viel Spaß & Erfolg bei der Vermehrung deines Wissens :-)
Themen: 242.975 | Beiträge: 1.352.293 | Mitglieder: 169.418 (Stand 28.01.10) | Fragen zur Nutzung von Tutorials.de? Nutzungsregeln | Kontaktformular | Impressum
[Oracle] Wer kennt wen über wen? Pfade in einem Graph auflisten
Hallo!
Gerade im Bereich von Social Networking Sites wie openbc / xing oder neuerdings auch das studivz findet sich eine interessante Funktionalität: Die Visualisierung des Pfades innerhalb eines Bekanntheitsgraphen der aufzeigt über welche Personen eine Person eine gewisse andere Person kennt.
Hierzu bin ich gerade über einen Interessanten Artikel gestolpert der diese Problematik (Edge list model of a non-tree graph) anhand eines Airline / Flughafen / Flugplan Szenarios erklärt. http://www.artfulsoftware.com/mysqlb...qled1ch20.html
Wenn ich die nächsten Tage mal etwas Zeit finde baue ich dazu vielleicht mal ein kleines Beispiel.
Damit haben wir einen Bekanntheitsgraphen definiert wie man ihn in der Grafik im Anhang sehen kann.
Möchten wir nun wissen über welche Verbindung User 3 den user 5 kennt so können wir folgende Abfrage benutzen:
sql Code:
SELECT socialnetwork.path
FROM
(SELECT
f.* ,
3|| SYS_CONNECT_BY_PATH(f.friendid,'-') path
FROM
t_friend f
connect BY nocycle prior f.friendid = f.userid
start WITH f.userid =3) socialnetwork
WHERE friendid =5
ORDERBY length(socialnetwork.path)
Als Ergebnis erhalten wir:
Code:
SQL> select socialnetwork.path
2 from
3 (select
4 f.* ,
5 3 || SYS_CONNECT_BY_PATH(f.friendid,'-') path
6 from
7 t_friend f
8 connect by nocycle prior f.friendid = f.userid
9 start with f.userid = 3) socialnetwork
10 where friendid = 5
11 order by length(socialnetwork.path)
12 /
PATH
---------------------------------------------------
3-2-4-5
3-2-1-4-5
Das bedeutet, dass der User 3 den User 5 über zwei verschiedene Verbindungen kennt:
1) 3-2-4-5
2) 3-2-1-4-5
Auf ähnliche Weise funktionieren auch die Beziehungsgraphen in den großen Networking Communities
wie Beispielsweise Xing/OpenBC, facebook, studivz und myspace.
AW: [Oracle] Wer kennt wen über wen? Pfade in einem Graph auflisten
Hi.
Kenne mich in oracle leider überhaupt nit aus. Lässt sich dieser Select denn auch auf MySQL anpassen?
Oder könntest mir kurz erkläeren was der folgende code genau macht
Code:
#
(SELECT
#
f.* ,
#
3 || SYS_CONNECT_BY_PATH(f.friendid,'-') path
#
FROM
#
t_friend f
#
connect BY nocycle prior f.friendid = f.userid
#
start WITH f.userid = 3)
AW: [Oracle] Wer kennt wen über wen? Pfade in einem Graph auflisten
Hallo,
Zitat:
Kenne mich in oracle leider überhaupt nit aus. Lässt sich dieser Select denn auch auf MySQL anpassen?
Nein, in MySQL existieren die notwendigen Elemente dazu nicht... im Link in meinem ersten post findest du jedoch ein paar Lösungsvorschläge zu diesem Problem für MySQL.
Zitat:
Oder könntest mir kurz erkläeren was der folgende code genau macht
Im Prinzip macht der Ausdruck nichts anderes als die hierarchische Verknüpfung der beiden beteiligten Tabellen über die angegebenen Spalten herzustellen. Da wir in unserem Graph Zyklen haben die das hierarchische auflösen erschweren, lasse ich die Zyklen ignorieren.
AW: [Oracle] Wer kennt wen über wen? Pfade in einem Graph auflisten
Muss die Tabelle "Friend" einen eigenen primärschlüssel haben oder geht das auch wenn man einen zusammengesetzten PK verwendet aus den beiden FK's?
__________________
Mein neues Projekt: zandman.de - Bericht über den Aufbau einer Entwicklungsumgebung für Test-Driven-Development mit phpUnderControl und dem Aufbau einer Webapplikation mit Zend Framework Version 1.9.x
AW: Wer kennt wen über wen? Pfade in einem Graph auflisten
Zitat:
Zitat von Thomas Darimont
Auf ähnliche Weise funktionieren auch die Beziehungsgraphen in den großen Networking Communities
wie Beispielsweise Xing/OpenBC, facebook, studivz und myspace.
Wie kommt es dann, dass ich auf studivz öfters schon mysql Fehlermeldungen gesehen habe?
Die müssen das mit mysql umgesetzt haben, nur wie?
AW: [Oracle] Wer kennt wen über wen? Pfade in einem Graph auflisten
Du hast geschrieben, dass es auf ähnliche Weise funktioniert.
Das wird wohl stimmen! Zweifelsohne!
Da die Funktionen die du bei deiner Abfrage verwendet hast in mysql nicht funktionieren bzw. existieren, wird das ganze wohl ganz anders aussehen. Deshalb lässt sich das wohl nicht mit studivz und ähnlichen Plattformen die mit mysql arbeiten vergleichen.
Ganz allgemein gesagt wird das alles "ähnlich" sein, wobei ähnlich sich in diesem Zusammenhang sehr "dehnen" lässt.
AW: [Oracle] Wer kennt wen über wen? Pfade in einem Graph auflisten
Hallo,
Zitat:
Du hast geschrieben, dass es auf ähnliche Weise funktioniert.
Das wird wohl stimmen! Zweifelsohne!
Da die Funktionen die du bei deiner Abfrage verwendet hast in mysql nicht funktionieren bzw. existieren, wird das ganze wohl ganz anders aussehen. Deshalb lässt sich das wohl nicht mit studivz und ähnlichen Plattformen die mit mysql arbeiten vergleichen.
Deshalb trägt der Thread ja auch die Kennzeichnung [Oracle] Weiterhin ist im Link im ersten Post gezeigt wie man diese Aufgabe auch mit MySQL lösen kann.
Zitat:
Ganz allgemein gesagt wird das alles "ähnlich" sein, wobei ähnlich sich in diesem Zusammenhang sehr "dehnen" lässt.
lg dani