2010-11-25 11 views
9

Estoy tratando de seleccionar todas las conexiones mutuas de amigos con PHP/FQL. Usar mi UID (540 amigos), lo que significa> 12,000 conexiones, de las cuales> 6500 son únicas. Así que este código debe devolver todas las conexiones, pero aparentemente Facebook tiene un límite de fila 4999/5000 en las consultas FQL.Amigos mutuos de Facebook y límite de registro FQL 4999/5000

// 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) 
"); 

sé los números anteriores porque el código original que escribió bucles a través de mi lista de amigos y envía una consulta getMutualFriend para cada uno de ellos.

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)); 
    } 
} 

Por supuesto, se tarda casi 3 minutos en ejecutar esa secuencia de comandos, mientras que la consulta FQL vuelve en 5 segundos. Después de una hora de buscar esta respuesta, llegué a la conclusión de que la única forma de evitar esto es usar una combinación de los dos métodos. Bueno eso, y publique aquí. ¿Alguna idea sobre una mejor forma de escribir este script y superar el límite de fila 4999/5000?

Aquí hay una fql_multiquery que debería hacer lo mismo que arriba. También está limitado a 4999/5000.

$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

¿Quieres amigos de amigos o amigos comunes? La cantidad de amigos mutuos únicos para todos tus amigos es probablemente la estadística más inútil que podría obtener de la API de FB. La API de Facebook solo le permite buscar amigos del usuario conectado, por lo que no puede obtener Amigos de amigos. – Matt

+0

Quise decir amigos mutuos; Intentaré corregir eso en el título. La inutilidad depende de tu perspectiva. Creé una aplicación para que las personas exporten sus datos y conseguir amigos en común (supuestamente para la visualización) es, con mucho, la característica más solicitada. – ow3n

+0

Debería poder lograrlo utilizando solicitudes por lotes y la conexión 'mutualfriends' de Graph API. https://developers.facebook.com/docs/reference/api/batch/ Publicaba una respuesta completa con un ejemplo cuando tengo el tiempo. –

Respuesta

7

Por lo tanto, estoy enviando la respuesta a mi pregunta original. Pude eludir el límite de 5000 filas en consultas FQL dividiendo la matriz de UID (usando la función de PHP array_chunk() apropiadamente nombrada) y recorriendo los fragmentos para ejecutar mini consultas y luego volver a anexar todo en una matriz . Todo el guión tiene un promedio de 14 segundos para más de 12,000 filas, por lo que es una gran mejora. Puede ver la aplicación en el trabajo aquí: givememydata.com

Ah, y Facebook debería reconsiderar su (aún no documentado) límite de fila FQL. ¿Qué es más impuestos en sus servidores? ¿Una sola consulta que se ejecuta en 5 segundos o 500 consultas que toman 180 segundos? Lo siento, tuve que desahogarme. ;-)

+0

¡Estoy en el mismo barco! ¡Consultando la tabla link_stat para el campo total_count y se detiene en 500 resultados! Voy a programar estas consultas, pero debería probar el intervalo más pequeño entre ellas. – brainondev

1

Una alternativa sería utilizar el método fql.multiquery, y construir una consulta separada para cada FQL amigo (o un grupo de amigos por consulta FQL), pero aún así el envío de todas las consultas en la misma petición.

+0

¿Entonces el total de la multiquery no está limitado? Parece que he superado los problemas del espacio en blanco con una prueba, pero parece que no puedo repetir mi consulta original con el multiquery. – ow3n

+0

Ok, descubrí el código de multilenguaje pero también es limitado. Lo pegué arriba. ¿Alguna idea? – ow3n

+0

@ ow3n: cada consulta FQL dentro de la multilengua sigue siendo limitada, pero divide la consulta en consultas más pequeñas: por lo tanto, en lugar de ejecutar una consulta grande para los 400 amigos, ejecute 10 consultas cada una actuando en nombre de 40 amigos. – Matt

0

FQL es compatible con un LIMIT, al igual que el SQL normal. Puedes intentar eso. http://developers.facebook.com/docs/guides/performance

De lo contrario, sugiero obtener los ID de amigo para cada usuario, almacenarlos en una tabla SQL, y luego realizar su propia combinación para obtener el filtro cruzado. Es posible que solo pueda obtener listas de amigos una vez y luego suscribirse a actualizaciones en tiempo real para mantener su lista actualizada. http://developers.facebook.com/docs/api/realtime

+0

Facebook no dice específicamente si son compatibles con la sintaxis LIMITE de 0,100, pero eso es lo que sugerí para superar el límite de 5 KB. –

+0

Gotcha. Intenté con LIMIT en todo lo anterior, pero lamentablemente no funcionó. – ow3n

1

Una observación interesante: Cuando trato de encontrar todas las personas que tienen amigos en común que me usuario la siguiente consulta

uid1 SELECT, uid2 DE DONDE amigo uid1 IN (SELECT uid2 DE DONDE amigo uid1 = $ uid)

Como puede ver, es muy similar a su consulta, excepto que eliminé la cláusula AND.

Aparece el siguiente mensaje de error: "No se pueden buscar todos los amigos de 208733. Solo se puede buscar al usuario que ha iniciado sesión o a los amigos del usuario que ha iniciado sesión que son usuarios de su aplicación".

Creo que Facebook es lo suficientemente inteligente como para darse cuenta de que estoy tratando de hacer algo que no quiere que haga. De alguna manera, detecta el hecho de que estás tratando de encontrar solo amigos de tu amigo que también sean tus amigos, mientras trato de encontrar a todos los amigos de mi amigo.

0

Un truco que parece que pude usar es limitar el número de consultas basadas en una de las columnas indexables de sus tablas (usando strpos (column_name, character/number)).

ejemplo:

$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' ))) ; 

Y de esta manera se puede dividir en 10 subconsultas, o para un campo en alphnumeric 33.

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

Agradable de ellos para agregar eso. – ow3n

0

que estaba haciendo una página FB cosa- pero conseguir similares posts- y se encontró con un caché gracioso en los servidores de FB cuando lo golpeé con multiqueries; la combinación de FQL es una forma de evitar esto, por cierto. Y sí, se topó con el límite de 5K y solo se combinó por debajo de 5k y tuve que configurar el paginating, lo cual fue un problema.

Cuestiones relacionadas