What is the correct way to access related items using the F # Freebase Type Provider
I have the following piece of code that aims to list the exchange websites listed in Freebase:
#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))
Without the last two lines (i.e. just listing Exchange names), the code works fine. With these lines, I am getting 400 (bad query).
The URL generated by this line is:
... and if I go to this I get this from 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"
}
}
Am I using the correct approach for accessing related objects? If so, is it a bug in the type provider? I am getting similar errors when accessing other related objects.
source to share
This was a bug in the type provider and has since been fixed: https://github.com/fsharp/FSharp.Data/issues/68
source to share
Like the error, you cannot override a property that is a primitive value property. You need to turn the query inside out so that it looks like this:
[{
"/type/object/id": "/en/amex",
"/common/topic/official_website": [{
"value": null,
"optional": true
}]
}]
The library should have some knowledge of primitive values, so maybe it's as simple as adding / type / uri to any list that contains / type / text, / type / rawstring, etc.
source to share