只是想知道什么时候只需要基本的GET / POST。 (即获取用户个人资料的简单内容,而不是像从每张专辑中获取图片那样复杂的事情)
哪个更快? 图表或FQL。
我知道FQL比图表更新,但不确定它是否更有效。
答案 0 :(得分:17)
这绝不具有这样的可比性。虽然您可以从两者获得相同的数据(在某些情况下) 他们的意图完全不同:FQL是一种查询语言,Graph是一种API。
如果使用新的JS SDK,则调用FQL查询是一个Graph API调用本身......
你可以(并且可能应该,如果你担心真正的比较而不是理论推测)比较返回相同数据的调用速度,但你应该考虑一些事情:
Field Expansion
请考虑以下FQL documentation示例,该子查询为活动用户和朋友提取所有用户信息:
SELECT uid, name, pic_square FROM user WHERE uid = me()
OR uid IN (SELECT uid2 FROM friend WHERE uid1 = me())
使用单个Graph API调用无法实现。(请参阅更新)
一旦定义了所需的数据子集,就可以根据自己的要求选择合适的检索方法。
BTW,FQL比Graph早得多,我们把它放在FBML(rip)和FBJS(rip)之外<强>更新强>
Graph API为Batch Requests提供方式并指定请求中的操作之间的依赖关系。例如,可以通过一次调用Graph API
来实现上述相同的样本POST https://graph.facebook.com/
POST Data:
batch=[
{
"method": "GET",
"name" : "get-friends",
"relative_url": "me/friends?fields=id",
},
{
"method": "GET",
"relative_url": "?ids={result=get-friends:$.data.*.id}&fields=id,name,picture"
}
]
更新2:
截至2012年8月30日,Graph API还支持Field Expansion作为额外(非常强大的)数据检索机制(包括嵌套数据)
答案 1 :(得分:3)
我使用PHP SDK运行了一个简单的测试(获取封面照片ID):
public $microtime_start = 0;
public function getExecutionTime() {
return round(microtime(true) - $this->microtime_start, 4);
}
public function getFQL($request, $filter = true, $multiFilter = true) {
if(is_array($request)) {
$query = '{';
foreach ($request as $key => $q) {
$query .= '"'.urlencode($key).'":"'.urlencode(addslashes($q)).'",';
}
$query = substr($query, 0, -1).'}';
$data = $this->callAPI('/fql?q=' . $query);
if($filter) {
$data = $data['data'];
if($multiFilter) {
$data = $data[count($data)-1]['fql_result_set'];
}
return $data;
}
} else {
$data = $this->callAPI('/fql?q=' . urlencode($request));
if($filter) {
return $data['data'];
}
}
}
public function callAPI($path) {
$params = array('access_token' => $this->getAccessToken());
return $this->api($path, 'GET', $params);
}
public function getCoverPhotoId($uid) {
$time = $this->getExecutionTime();
$albums = $this->api("/me/albums");
$album_id = "";
foreach ($albums["data"] as $item) {
if ($item["name"] == "Cover Photos") {
$album_id = $item["id"];
$profile_picture_id = $item["cover_photo"];
break;
}
}
$time2 = $this->getExecutionTime();
echo 'graph api: '.($time2 - $time).'<br/>';
$data = $this->getFQL(array(
'query1' => 'SELECT cover_object_id FROM album WHERE owner = ' . $uid.' AND name = "Cover Photos"'
));
$time3 = $this->getExecutionTime();
echo 'graph api with FQL: '.($time3 - $time2).'<br/>';
$data = $this->api(
array(
'method' => 'fql.query',
'query' => 'SELECT cover_object_id FROM album WHERE owner = ' . $uid.' AND name = "Cover Photos"'
)
);
$time4 = $this->getExecutionTime();
echo 'FQL via rest api: '.($time4 - $time3).'<br/>';
}
结果:
graph api:1.28320002556
图表api与FQL:0.744100093842
FQL via rest api:0.544199943542
基本的FQL要快得多,通过图形api的FQL是可以的,但是图形api太慢了......你会得到一堆无用的图形api