2013-04-16 24 views
0

我正在運行一個FQL查詢,我保持這個錯誤,但不知道爲什麼,因爲錯誤消息告訴我什麼。查詢和錯誤是:Facebook FQL未知錯誤當搜索朋友鏈接

SELECT backdated_time, can_backdate, caption, created_time, owner, owner_comment, picture, summary, title, url FROM link WHERE owner IN (SELECT uid2 FROM friend WHERE uid1 = me()) AND (strpos(lower(summary),"boston") >=0 OR strpos(lower(owner_comment),"boston") >=0) LIMIT 20 

Fatal error: Uncaught Exception: 1: An unknown error occurred 
    thrown in /Facebook/base_facebook.php on line 1254 

有沒有人知道爲什麼會出現這個錯誤?我正在使用Facebook PHP庫。

回答

1

這很嗆,查詢太大了。考慮使用多查詢,朋友查詢的LIMIT和一些OFFSET來遍歷數據。

fql?q={"friendsquery":"SELECT uid2 FROM friend WHERE uid1 = me() LIMIT 20 OFFSET 0","linkquery": "SELECT backdated_time, can_backdate, caption, created_time, owner, owner_comment, picture, summary, title, url FROM link WHERE owner IN (SELECT uid2 FROM #friendsquery) AND (strpos(lower(summary),'boston') >=0 OR strpos(lower(owner_comment),'boston') >=0) LIMIT 20"}

該電流查詢會在80秒爲400

這裏的朋友列表是Python的一個例子,它不是PHP,但API的實現是一樣的

from facepy import GraphAPI 
import time 
import urllib 
import json 

fb_dump = open('dumpfb.txt', 'w') 

graph = GraphAPI('MY_ACCESS_TOKEN') 

all_posts = [] 
offset = 0 

friendsquery = 'SELECT uid2 FROM friend WHERE uid1 = me() LIMIT 20 OFFSET '+ str(offset) 

linksquery = 'SELECT backdated_time, can_backdate, caption, created_time, owner, owner_comment, picture, summary, title, url FROM link WHERE owner IN (SELECT uid2 FROM #friendsquery) AND (strpos(lower(summary),"trinidad") >=0 OR strpos(lower(owner_comment),"trinidad") >=2) LIMIT 20' 


t0 = time.time() 

try: 
    my_posts = graph.fql({'friendsquery': friendsquery, 'linksquery': linksquery}) 
    while my_posts["data"][0]["fql_result_set"]: 
     all_posts = all_posts + my_posts["data"] 
     offset = offset + 20 
    friendsquery = 'SELECT uid2 FROM friend WHERE uid1 = me() LIMIT 20 OFFSET '+ str(offset) 
    my_posts = graph.fql({'friendsquery': friendsquery, 'linksquery': linksquery}) 
    t1 = time.time() 
    print t1-t0 
    fb_dump.write(json.dumps(all_posts, indent=4)) 
except GraphAPI.OAuthError, e: 
    print e.message 

執行批量查詢可以將查詢縮短到25秒。速度不是很快,但比前兩個查詢快。我沒有做它在PHP,但你應該得到的要點

這是在一個批處理和一個/我的/朋友來電

fb_dump = open('lumpfb.txt', 'w') 

graph = GraphAPI('MY_ACCESS_TOKEN') 


all_posts = [] 
offset = 0 

friendsquery = 'SELECT uid2 FROM friend WHERE uid1 = me() LIMIT 20 OFFSET ' 

linksquery = 'SELECT backdated_time, can_backdate, caption, created_time, owner, owner_comment, picture, summary, title, url FROM link WHERE owner IN (SELECT uid2 FROM #friendsquery) AND (strpos(lower(summary),\'trinidad\') >=0 OR strpos(lower(owner_comment),\'trinidad\') >=2) LIMIT 20' 


t0 = time.time() 

batch_request = [] 

try: 
    my_friends = graph.get("me?fields=friends") 
    counter = len(my_friends["friends"]["data"]) 
    while counter > 0 : 
    friendsquery0 = 'SELECT uid2 FROM friend WHERE uid1 = me() LIMIT 20 OFFSET '+ str(offset) 
    the_query = '{"friendsquery":"'+friendsquery0+'","linksquery":"'+linksquery+'"}' 
    batch_item = {"method":"GET","relative_url":"fql?q=" + the_query} 
    batch_request.append(batch_item) 
    offset = offset + 20 
    counter = counter - 20 
    my_posts = graph.batch(batch_request) 
    for post in my_posts: 
    all_posts = all_posts + post['data'] 
    t1 = time.time() 
    print t1-t0 
except facepy.exceptions.FacepyError, e: 
    print e.message 
+0

好了20多查詢,所以你說我有限制那麼搜索的朋友的數量,因爲通過所有關閉他們太多? –

+0

@DevinDixon您限制**每**查詢。在此之後的下一個查詢將有朋友查詢作爲選擇uid2從朋友在哪裏uid1 =我()極限20 ** OFFSET 20 ** – phwd

+0

好吧,我明白了。我的限制似乎是50.這個答案我想標記爲一半正確的,因爲雖然未知錯誤的問題不再存在,但解決方案效率非常低。與Twitter不同的是,Facebook的搜索似乎普遍存在。 –