2

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

[{
    "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 并且根据时间子查询来思考,我应该以其他方式思考。

4

1 回答 1

1

MQL 不允许您将两个事物限制为相等,因此您不能完全在 MQL 中做到这一点,但您可以通过简单的后处理阶段获得过滤事物所需的所有数据。

您已经获得了所有演员和他们的第一部电影,因此您只需要重用该子查询来询问该电影集中所有其他演员的第一部电影。

您的查询将如下所示。然后,您需要遍历匹配项并使用以下内容查找您的内部演员的第一部电影与您的外部演员的第一部电影相同:

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
}]​
于 2012-11-18T18:03:01.957 回答