3

Freebase に上場している証券取引所の Web サイトをリストすることを目的とした、次のコードがあります。

#if INTERACTIVE
#r @"C:\Users\kit\Documents\Visual Studio 11\Projects\Demo\packages\FSharpx.TypeProviders.1.7.4\lib\40\FSharpx.TypeProviders.dll"
#r @"C:\Users\kit\Documents\Visual Studio 11\Projects\Demo\packages\FSharpx.TypeProviders.Freebase.1.7.4\lib\40\FSharpx.TypeProviders.Freebase.dll"
#r @"C:\Users\kit\Documents\Visual Studio 11\Projects\Demo\packages\FSharpx.TypeProviders.Freebase.1.7.4\lib\40\FSharpx.TypeProviders.Freebase.DesignTime.dll"
#endif 

let GetExchanges() =
    let dc = FreebaseData.GetDataContext()
    dc.DataContext.SendingRequest.Add(fun e -> printfn "url: %s" e.RequestUri.AbsoluteUri)

    dc.``Products and Services``.Business.``Stock exchanges``
    |> Seq.truncate 10
    |> Seq.iter (fun exchange -> printfn "Exchange: %s" exchange.Name
                                 exchange.``Official website``
                                 |> Seq.iter (fun site -> printfn "%s" site.Name))

最後の 2 行 (つまり、Exchange 名をリストするだけ) がなくても、コードは正常に機能します。これらの行で、400 (Bad Request) が返されます。

その行によって生成される URL は次のとおりです。

https://www.googleapis.com/freebase/v1/mqlread?query=%5B%7B%22/type/object/id%22:null,%20%22/type/object/name%22:null% 20,%20%22optional%22:true,%20%22/type/object/type%22:%22/type/uri%22,%20%22!/common/topic/official_website%22:%20% 5B%7B%22/type/object/id%22:%22/en/amex%22,%22/type/object/type%22:%22/common/topic%22%20,%20%22limit% 22:%20500%7D%5D%7D%5D&カーソル

...そして、それを参照すると、Freebase からこれを取得します。

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "badRequest",
    "message": "Can't reverse /common/topic/official_website as it expects /type/uri, not an object"
   }
  ],
  "code": 400,
  "message": "Can't reverse /common/topic/official_website as it expects /type/uri, not an object"
 }
}

リンクされたエンティティにアクセスするための正しいアプローチを使用していますか? もしそうなら、これは Type Provider のバグですか? 他のリンクされたエンティティにアクセスしても同様のエラーが発生します。

4

2 に答える 2

4

エラーが示すように、プリミティブ値プロパティであるプロパティを逆にすることはできません。次のように、クエリを裏返しにする必要があります。

[{
  "/type/object/id": "/en/amex",
  "/common/topic/official_website": [{
    "value":    null,
    "optional": true
  }]
}]​

ライブラリはプリミティブ値の知識を持っている必要があるため、/type/text、/type/rawstring などを含むリストに /type/uri を追加するのは簡単です。

于 2013-02-08T16:55:20.977 に答える
4

これはタイプ プロバイダーのバグであり、その後修正されました: https://github.com/fsharp/FSharp.Data/issues/68

于 2013-02-08T10:42:51.293 に答える