Hallo,
hier mal ein kleines Beispiel zum Aufbau eines Bekanntheitsgraphen in Oracle 10g mithilfe der neuen hierarchischen Abfragemöglichkeiten
in Oracle 10g ->
http://www.oracle.com/technology/ora...ectby_10g.html
Unsere User Tabelle:
|
sql Code:
|
-
-
-
-
-
-
| CREATE TABLE t_user (id number NOT NULL, name varchar2(45) NOT NULL, PRIMARY KEY (id)); INSERT INTO t_user VALUES (1,'Tom'); INSERT INTO t_user VALUES (2,'Fritz'); INSERT INTO t_user VALUES (3,'Hans'); INSERT INTO t_user VALUES (4,'Anne'); INSERT INTO t_user VALUES (5,'Paula');
|
|
Unsere Friends Tabelle:
|
sql Code:
|
-
-
-
-
-
-
-
-
-
-
| CREATE TABLE t_friend (id number NOT NULL , userid number NOT NULL, friendid number NOT NULL, PRIMARY KEY (id)); INSERT INTO t_friend VALUES(1,1,2); INSERT INTO t_friend VALUES(2,1,4); INSERT INTO t_friend VALUES(3,2,1); INSERT INTO t_friend VALUES(4,2,3); INSERT INTO t_friend VALUES(5,2,4); INSERT INTO t_friend VALUES(6,3,2); INSERT INTO t_friend VALUES(7,4,1); INSERT INTO t_friend VALUES(8,4,5); INSERT INTO t_friend VALUES(9,5,4);
|
|
Unsere User Tabelle:
|
sql Code:
|
-
-
-
-
-
-
-
-
-
| SQL> SELECT * FROM t_user; ---------- ---------------------------------------------
|
|
Unsere User Tabelle:
Unsere Friend Tabelle:
|
sql Code:
|
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
| SQL> SELECT * FROM t_friend; ---------- ---------- ----------
|
|
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 3 || SYS_CONNECT_BY_PATH(f.friendid,'-') path connect BY nocycle prior f.friendid = f.userid start WITH f.userid = 3) socialnetwork ORDER BY 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.
Gruß Tom