2

私は同じ最初の映画を共有している俳優を見つけようとしました。すべての俳優の最初の映画を見つけるのは簡単でした。

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

その後、2つのクエリの結果を交差させたいと思いました。まず、freebase.comのクエリエディタで、同じ映画に2人の俳優が参加する必要がある例に気づきました。

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

しかし、2つの同じクエリの前に「a:film」、「b:film」などのような変更を加えようとすると、常にエラーが発生しました。おそらく私はSQLに慣れすぎており、一時的なサブクエリの観点から考える必要があります。別の方法で考える必要があります。

4

1 に答える 1

1

MQLでは、2つのものが等しくなるように制約することはできないため、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 に答える