Prototyp: Ãœber wen bin ich mit dem User gerade in Verbindung?

Begonnen von k00ni, 22. Mai 2008, 17:01:31

Vorheriges Thema - Nächstes Thema

k00ni

Ich hatte diese Woche etwas Graphentheorie in der Vorlesung und hab mir �berlegt, dass man dies nutzen kann, um eine nette Funktion zu implementieren.
Die Idee ist folgende: Man geht auf ein Userprofil und bekommt angezeigt, �ber welche User man diesen User \"kennt\" bzw. mit ihm in Verbindung steht.
Manche kennen dies bereits von xing.com oder anderswo her. Ich m�chte nun hier mal meine Idee vorstellen und hoffe, dass der eine oder andere da vielleicht noch Optimierungen findet oder Kritik �bt.


Ich gehe davon aus, dass man 2 Tabellen hat. Eine Tabelle f�r die User. Dort stehen Informationen �ber die User drin, wie E-Mail, Name, Avatar etc. (pfuser). Dann hat man eine Tabelle f�r die Freundschaften. Dort steht drin, wer mit wem befreundet ist. Sowohl hin, als auch zur�ck.
Dies ist bereits mittels pSys gegeben. Ob und wie die Freundschaftstabelle \"gedacht\" ist, wei� ich nicht genau. Ich gehe einfach davon aus, dass man dort sowohl die Hin-, als auch Zur�ckrichtung speichert.
Der eigentliche Algorithmus sieht nun wie folgt aus: Man holt sich seine direkten Freunde und die Freunde des Users, auf den man gerade geklickt hat. Nun w�re die Frage, ob man gleich noch die Freunde der Freunde holt (von mir sowie von dem User wo ich gerade auf dem Profil bin) um bei langen Freundschaftsketten die Anzahl der Abfragen etwas zu minimieren.
Hat man die Liste, dann schaut man, ob irgendeine Person sowohl in der einen Liste, als auch in der anderen drin ist. Wenn ja, dann zeigt man die Verkn�pfung von mir �ber die gefundenen Freunde bis hin zu dem Userprofil an. Wenn nein, holt man sich die Freunde der Freunde und wiederholt das Spiel.
Die Knackpunkte w�ren die Anzahl und Art der Abfrage der Verkn�pfungen. Frage ich gleich alle Datens�tze der Tabelle ab oder nur die Freunde meiner Freunde, deren Freunde und wieder deren Freunde usw. . Der andere Punkt w�re die Suche der / des gemeimsamen Freunde/es.
Ich bin auf die Anregungen gespannt /uploads/emoticons/icon_e_smile.gif.4a0acefcb917340d2c82e5239c009e6e.gif\" alt=\":)\" />
 - Editiert von k00ni am 22.05.2008, 23:19 -
 - Editiert von k00ni am 10.11.2009, 23:12 -

Sowohl der Threadtitel als auch deine Ausführungen sind mit Sicherheit für viele Besucher und Leser hier absolut verwirrend.
Der Knackpunkt (es gibt meiner Meinung nach nur einen) ist der Sinn oder Unsinn.
Dann sollte eine verständliche Beschreibung folgen. In gutem Deutsch und mit wenig verschachtelten Sätzen, bitte. Jede Person, die einigermaßen Deutsch versteht, sollte ersehen können, worum es dir geht.
Danke für die Geduld, dies hier gelesen und akzeptiert zu haben.
Grüße aus dem sonnigen Kalifornien.
 
(Nach Diktat verreist.) [/uploads/emoticons/icon_e_surprised.gif.a005678239f11b45b64b526b2c82e9a1.gif\" alt=\":o\" />]

k00ni

[ot]LOL,
wir sind hier nicht in der Schule wo man Aufsätze schreibt. Weiterhin war das mit der Kritik keine Aufforderung meinen Ausdruck und meine Rechtschreibung zu checken. Vielleicht liest du nochmal genau /uploads/emoticons/icon_e_wink.gif.3167d127940f44558fbf1ccd9b6d60a9.gif\" alt=\";-)\" />
Sowohl der Threadtitel als auch deine Ausführungen sind mit Sicherheit für viele Besucher und Leser hier absolut verwirrend.[/quote]
Das mag sein. Aber ich schreibe hier auch an Coder und Entwickler und die wissen ggf. worauf ich hinaus will.[/ot]
Und nun bitte wieder btT.

dec

Bei XING oder facebook, studivz und meinvz hat es ähnliche Darstellungsarten des Freunde-Netzes. Würde ich auch noch ein nettes Feature für psys|Forum finden!

spass ist, was ihr draus macht



Original von DEC Bei XING oder facebook, studivz und meinvz hat es ähnliche Darstellungsarten des Freunde-Netzes. Würde ich auch noch ein nettes Feature für psys|Forum finden!
[/quote]
Gewiss, aber bitte anständig formulieren, was man meint, oder nicht? /uploads/emoticons/icon_e_wink.gif.c059000ae48ff64afa53be0962c021f2.gif\" alt=\":wink:\" />

Powie

Also pSys im Standard wird sowas nicht aufnehmen können. Es gibt zwar eine Buddyliste, aber ein echtes \"Freundesnetz\" ist hiermit bisher nicht realisierbar. Dazu muss die Freundestabelle ein wenig anders aussehen.
Für das Friends Modul passt es natürlich super dazu!
Mit den SQL\'s das kann nicht so schwer sein, vielleicht kennt sich ja jemand mit Rekursiv SQL aus und kann da mal einen Anstoss geben.

Die Knackpunkte wären die Anzahl und Art der Abfrage der Verknüpfungen. Frage ich gleich alle Datensätze der Tabelle ab oder nur die Freunde meiner Freunde, deren Freunde und wieder deren Freunde usw. . Der andere Punkt wäre die Suche der / des gemeimsamen Freunde/es.[/quote]
Vielleicht ist dir das small world phenomenon ein Begriff. Daraus ergibt sich dann auch schon die maximal Suchtiefe (5.5, besser 6), also Wiederholungen, die maximal möglich sind. Allerdings steigt die Wahrscheinlichkeit, alle hinterlegten User in einer Beziehung zu finden, fast auf 1 - ist also sinnlos, da es die Frage, mit welchem User ein anderer User verbunden ist, auf die Antwort \"Mit allen Usern\" reduziert und damit wenig aussagekräftig ist - so wird ein zusammenhängender Graph erzeugt (jeder ist mit jedem verbunden). Kürzeste Verbindungen kann man mit Dijkstras Algorithmus finden.
Ich würde nur eine Ebene erlauben, aber dafür den Grad der Verbindung bestimmen:
User x ist (bekannt,verwandt,befreundet,verheiratet,verlobt, ...) mit User y.
Man könnte dann den Grad der Verbindung gewichten und so nicht nur eine einfache Aussage über die Zahl der Verbindungen, sondern auch über deren Qualität treffen (Bestimmgung guter Verbindunge durch umgekehrten Primschen Algorithmus).
So, genug Graphentheorie.

Vielleicht sollte Psys auch erst mal aus dem Beta-Stadium rauswachsen, bevor man zu viele neue Ideen hinein bastelt.
Für mich wäre aktuell eine stabile und problemlos laufende mehrsprachig benutzbare Version von Psys interessant.
[ot]Und ich wünsche mir einen Umgangston auf sachlicher Basis in diesem Forum. Einschließlich einem nicht hitzköpfigen Admin mit Kritik-Löschmanie[/ot]

lit-web

Hallo!
Also vieleicht könnte man das auch auf andere Kriterien basteln. Zum Beispiel nach Interessen von verschiedenen Usern und eben nach solchen Interessen ein solches Netzwerk aufbauen!
mfg der Litter

Taugenichtse die was haben,haben was gegen Habenichtse die was taugen!!!!


Ich persönlich wäre auch eher an gemeinsamen Interessengruppierungen interessiert. Vielleicht auch noch Wohnort bezogen (Umkreissuche usw.)

Vielleicht sollte Psys auch erst mal aus dem Beta-Stadium rauswachsen, bevor man zu viele neue Ideen hinein bastelt.[/quote]
Und was genau hat das mit der Idee von k00ni zu tun? Die Entwicklung des PSys liegt alleine in den Händen von Powie.
Was hast Du noch mal genau dazu beigetragen?
Für mich wäre aktuell eine stabile und problemlos laufende mehrsprachig benutzbare Version von Psys interessant.[/quote]
Na, dann hau doch mal in die Tasten.
[edit]Schade, er hat sich schon abgemeldet.[/edit]

k00ni

Nabend,
ich habe gerade mal etwas herumgewerkelt. Der Prototyp erkennt, ob man eine Verbindung über eine andere Person zu der gerade ausgewählten Person hat. Also ist man auf dem Profil eines anderen Benutzers, so kann man durch eine neue Tabelle sehen, ob man diesen User über eine weitere Person kennt, wenn man NOCH NICHT mit ihm befreundet ist.
Da das ein erster Entwurf ist, ist davon auszugehen, dass das Ding nicht sehr performant ist. Wer also noch Speed-Ups sieht, bitte melden.
Nun zum eigentlichen Code...


An sich sind es 2 Funktionen:
1) get_users_friends
2) get_connection_between_users
Die Funktion (1) ermittelt alle Freunde eines Benutzers. (Einfache Liste von User-IDs aus der Spalte buddyid)
Die Funktion (2) ist die eigentliche Funktion für das Ermitteln einer Zwischenperson, über die man eine andere Person kennt. Sie geht so vor, dass sie erstmal alle Freunde der Hauptperson (das ist man meist selbst) und der gesuchten Person ermittelt und in eine einfache Listen packt. Dann wird geprüft, ob man die gesuchte Person direkt als Freund hat, d.h. sie ist bereits bei einem auf der Buddyliste.
Ist dem nicht so, wird geprüft ob es einen Freund von der Hauptperson gibt, welcher die gesuchte Person wiederum als Freund hat. Wenn dem so ist, wird die ID des Freundes zurückgeliefert. Die Verbindung wird dann optisch über dem Profil dargestellt.
Hier die Funktion 2:
 

fetch_row ( \"SELECT userid
                            FROM $tab_userbuddy
                         WHERE userid IN ( \". implode ( \',\', $main_users_friends ) .\" ) AND
                               buddyid = $searched_user
                        LIMIT 1;\" );
   // Wenn ein User ( X ) gefunden wurde.
   if ( 1 == $pdb->num_rows )
   {
      return $tmp [\'userid\'];
   }
}
}
return 0;
}
?>

 
 
Wie gesagt Funktion 1 liefert immer ein eindimensionales Array, wenns geht mit einer Liste von User-IDs der Freunde.
Die Funktion 2 ist so ausgelegt, dass sie sowohl für andere Buddy-Systeme nutzbar ist, als auch noch auf weitere Stufen erweitert werden kann. Von der Skalierung her ist es vielleicht nicht gerade das Beste, da man im schlimmsten Fall immer alle eigenen Freunde und die der gesuchten Person durchgeht.

hello007

Naja Ansatz ist nicht schlecht.
So wie es aussieht baust du dir ein array zusammen von den ganzen freundes von user a
und dann übergibst du freunde user a an user b und schaust ob die gleich sind.
wenn ja dann soll er die ausspucken.
 
Soche scripte würd ich auch persönlich lieber in C++ schreiben als in php. PHP  braucht verdammt viel cpu in gegensatz zu c++ oder c.
 

alias theCrack




Oldmember of Kryptocrew


all your base are belong to us