与mql更复杂的连接

时间:2012-11-17 19:52:08

标签: freebase mql

我试图找到分享同一部电影的演员。 很容易找到所有演员的第一部电影。

[{
    "type": "/film/actor",
    "name": null,
    "/film/actor/film": [{
      "film": [{
        "name":          null,
        "initial_release_date": null
      }],
      "sort":  "film.initial_release_date",
      "limit": 1
    }]
}]

之后我想做出两种查询结果的交集。首先,我在freebase.com的查询编辑器中注意到一个例子,我们需要两个演员参与同一部电影

[{
  "a:starring": [{
    "actor": "Joe Pesci"
  }],
  "b:starring": [{
    "actor": "Robert de Niro"
  }],
  "name": null,
  "id":   null,
  "starring": [{
    "actor": null
  }],
  "type": "/film/film"
}]

但是,当我尝试进行类似的更改时,在我的两个完全相同的查询前面加上“a:film”,“b:film”之类的内容,总会出现错误。可能我已经习惯了SQL并且考虑了时间子查询,我应该考虑其他方式。

1 个答案:

答案 0 :(得分:1)

MQL不允许你将两件事情约束在一起,所以你不能完全用MQL来做这件事,但是你可以通过一个简单的后处理阶段获得过滤所需的所有数据。 / p>

你已经拥有了所有的演员和他们的第一部电影,所以你只需要重复使用那个子查询来询问这组电影中所有其他演员的第一部电影。

您的查询将如下所示。然后你需要迭代匹配并寻找你的内在演员的第一部电影与外部演员的第一部电影相同的东西,使用类似的东西:

film_id = film.film.mid
for appearance in film.film.starring:
  if appearance.actor.film.film.mid == film_id:
    print "%s and %s shared the same first film %s" % (mid,appearance.actor.mid,film_id)

请注意,您应该对ID进行比较,而不是对名称进行比较,这样就不会为具有相同名称(不常见但可能)的不同影片进行错误匹配。

以下是用于生成所需信息的MQL:

[{
  "type":  "/film/actor",
  "name":  null,
  "mid":   null,
  "film": {
    "film": {
      "name":          null,
      "mid":           null,
      "initial_release_date": null,
      "starring": [{
        "actor": {
          "name": null,
          "mid":  null,
          "film": {
            "film": {
              "name":          null,
              "mid":           null,
              "initial_release_date": null
            },
            "sort":  "film.initial_release_date",
            "limit": 1
          }
        }
      }]
    },
    "sort":  "film.initial_release_date",
    "limit": 1
  },
  "limit": 2
}]​