2010-11-25 3 views
9

Ich versuche, alle gegenseitigen Freunde Verbindungen mit PHP/FQL zu wählen. Mit meiner UID (540 Freunde), was> 12.000 Verbindungen bedeutet, von denen> 6500 einzigartig sind. Also dieser Code sollte alle Verbindungen zurückgeben, aber Facebook hat offenbar eine 4999/5000 Zeilenbegrenzung für FQL-Abfragen.Facebook gemeinsame Freunde und FQL 4999/5000 Rekord Grenze

// select mutual unique friends 
$unique_connections = $facebook->api_client->fql_query(" 

    SELECT uid1, uid2 FROM friend 
    WHERE uid1 IN 
    (SELECT uid2 FROM friend WHERE uid1=$uid) 
    AND uid2 IN 
    (SELECT uid2 FROM friend WHERE uid1=$uid) 
"); 

Ich kenne die Zahlen oben, da der ursprüngliche Code, den ich schrieb Schleifen durch meine Freundesliste und sendet eine getMutualFriend Abfrage für jeden von ihnen.

foreach ($friends as $key) 
{ 
    $mutual_friends = $facebook->api_client->friends_getMutualFriends($key); 
    foreach ($mutual_friends as $f_uid) 
    { 
     array_push($all_connections, array($key,$f_uid)); 
    } 
} 

Natürlich dauert es fast 3 Minuten, um das Skript auszuführen, während die FQL-Abfrage in 5 Sekunden zurückkehrt. Nach einer Stunde Suche nach dieser Antwort bin ich zu dem Schluss gekommen, dass der einzige Weg, um dies zu umgehen, eine Mischung der beiden Methoden ist. Gut, und post hier. Irgendwelche Ideen für einen besseren Weg, dieses Skript zu schreiben und das 4999/5000 Zeilenlimit zu übertreffen?

Hier ist eine fql_multiquery, die das gleiche wie oben tun sollte. Es ist auch auf 4999/5000 begrenzt.

$queries = '{ 
"user_friends":"SELECT uid2 FROM friend WHERE uid1 = '.$uid.'", 
"mutual_friends":"SELECT uid1, uid2 FROM friend WHERE uid1 IN (SELECT uid2 FROM #user_friends) AND uid2 IN (SELECT uid2 FROM #user_friends)" 
}'; 

$mq_test = $facebook->api_client->fql_multiquery(trim($queries)); 
print_r($mq_test); 
+0

Wollen Sie Freunde von Freunden oder gemeinsame Freunde? Die Anzahl der einzigartigen gemeinsamen Freunde für alle deine Freunde ist wahrscheinlich die sinnloseste Statistik, die ich aus der FB API ziehen könnte. Die Facebook-API ermöglicht es Ihnen nur, Freunde des angemeldeten Benutzers nachzuschauen, sodass Sie keine Freunde von Freunden erhalten können. – Matt

+0

Ich meinte gegenseitige Freunde; Ich werde versuchen, das im Titel zu korrigieren. Die Sinnlosigkeit hängt von Ihrer Perspektive ab. Ich habe eine App erstellt, mit der Leute ihre Daten exportieren können und gemeinsame Freunde finden (vermutlich zur Visualisierung). – ow3n

+0

Sie sollten das erreichen können, indem Sie Batch-Requests und die '' '' '' ''' '' '' '' '' '' '' '' '' '' '' '' 'Verbindungen aus der Graph-API verwenden. https://developers.facebook.com/docs/reference/api/batch/ Ich würde eine vollständige Antwort mit einem Beispiel posten, wenn ich Zeit habe. –

Antwort

7

Also, ich posten die Antwort auf meine ursprüngliche Frage. Ich war in der Lage, die Grenze von 5000 Zeilen bei FQL-Abfragen zu umgehen, indem ich das Array von UIDs (unter Verwendung der PHP-Funktion array_chunk() mit entsprechender Bezeichnung) durchbohre und die einzelnen Blöcke durchlief, um Mini-Abfragen auszuführen und dann alles wieder in ein Array einzufügen . Das ganze Skript dauert durchschnittlich 14 Sekunden für über 12.000 Zeilen, was eine enorme Verbesserung darstellt. Sie können die Anwendung bei der Arbeit hier sehen: givememydata.com

Oh, und Facebook sollte ihre (noch undokumentiert) FQL Zeilenlimit überdenken. Was kostet ihre Server mehr? Eine einzelne Abfrage, die in 5 Sekunden oder 500 Abfragen ausgeführt wird, die 180 Sekunden dauern? Entschuldigung, musste entlüften. ;-)

+0

Ich bin auf dem gleichen Boot! Abfrage der Tabelle link_stat für das Feld total_count und es stoppt bei 500 Ergebnissen! Ich werde diese Abfragen cron, aber ich sollte das kleinste Intervall zwischen ihnen testen. – brainondev

1

Eine Alternative wäre die fql.multiquery Methode zu verwenden, und baut eine separate FQL Abfrage für jeden Freund (oder eine Gruppe von Freunden pro FQL Abfrage), aber immer noch alle Anfragen in der gleichen Anfrage senden.

+0

Also ist die Summe der Multiquery nicht begrenzt? Ich habe die seltsamen Whitespace-Probleme mit einem Test überwunden, kann aber meine ursprüngliche Abfrage mit der Multiquery nicht wiederholen. – ow3n

+0

Ok, ich habe den Multiquery-Code herausgefunden, aber er ist auch begrenzt. Ich habe es oben eingefügt. Irgendwelche Gedanken? – ow3n

+0

@ ow3n: Jede FQL-Abfrage innerhalb der Multiquery ist immer noch begrenzt, aber Sie teilen die Abfrage in kleinere Abfragen auf: Führen Sie statt einer großen Abfrage für alle 400 Freunde 10 Abfragen aus, die jeweils für 40 Freunde agieren. – Matt

0

FQL unterstützt ein LIMIT, genau wie reguläres SQL. Du kannst es versuchen.

Ansonsten empfehle ich, die Freund-IDs für jeden Benutzer zu bekommen, diese in einer SQL-Tabelle zu speichern und dann einen eigenen Join durchzuführen, um den Crossover zu bekommen. Möglicherweise können Sie die Freundeslisten nur einmal abrufen und dann Echtzeit-Updates abonnieren, um Ihre Listen auf dem neuesten Stand zu halten. http://developers.facebook.com/docs/api/realtime

+0

Facebook gibt nicht ausdrücklich an, ob sie die Syntax von 0,100 LIMIT unterstützen, aber das ist es, was ich vorgeschlagen habe, um das 5K-Limit zu überschreiten. –

+0

Gotcha. Ich habe LIMIT in all dem oben versucht, aber leider hat es nicht funktioniert. – ow3n

1

Eine interessante Beobachtung: Wenn ich versuche, alle Leute zu finden, die mich I Benutzer die folgende Abfrage

SELECT UID1, UID2 FROM Freund WHERE UID1 IN (SELECT UID2 FROM Freund WHERE UID1 gemeinsame Freunde haben = $ uid)

Wie Sie sehen können, ist es Ihrer Abfrage sehr ähnlich, außer dass ich die UND-Klausel entfernt habe.

Ich erhalte die folgende Fehlermeldung: "Kann nicht alle Freunde von 208733 suchen. Kann nur nach dem angemeldeten Benutzer oder den Freunden des angemeldeten Benutzers suchen, die Benutzer Ihrer App sind".

Ich glaube, Facebook ist schlau genug, um herauszufinden, dass ich versuche, etwas zu tun, das ich nicht tun soll. Es erkennt irgendwie die Tatsache, dass Sie nur die Freunde Ihres Freundes suchen, die auch Ihre Freunde sind, während ich versuche, alle Freunde meines Freundes zu finden.

0

Ein Trick, den ich verwenden konnte, ist, die Anzahl der Abfragen basierend auf einer der indexierbaren Spalten aus Ihren Tabellen zu begrenzen (mit strpos (column_name, character/number)).

ex:

$fql = "SELECT pid,src_big,owner FROM photo WHERE album_object_id IN 
     (SELECT object_id FROM privacy WHERE 
      (object_id IN (SELECT object_id FROM album WHERE owner IN (SELECT uid2 FROM friend WHERE 
        (uid1 = " . $this->nextUser->fbid . " AND **strpos(uid2,2) = 1** )))         
      AND (value = 'FRIENDS_OF_FRIENDS' OR value = 'EVERYONE' ))) ; 

Und auf diese Weise Sie es in 10 Unterabfragen aufgeteilt, oder für ein alphnumeric Feld in 33.

5
$mutual_friends = $facebook->api('/me/mutualfriends/friendid'); 
+0

Schön von ihnen, das hinzuzufügen. – ow3n

0

Ich war ein ähnliches Ding aber immer fb Seite tun Posts - und rannte in lustige Zwischenspeicherung auf den FB-Servern, wenn ich es mit Multi-Abfragen pummeled - Batch-FQL ist eine Möglichkeit, um dies zu umgehen, übrigens. Und ja, lief in die 5K-Grenze und nur unter 5k gestapelt und musste paginieren, was ein Schmerz war.