Article

Tests

BeginPackage["Wikicode`DBpedia`"]

Data::usage = "Data[label,properties] returns the given properties \
for an item or collection determined by label. Data[item,\"Properties\
\"] returns a list of the available properties for the given item. \
Data[item,\"Types\"] returns the list of types associated with the \
given item."

Types::usage = "Types[item] returns the list of types associated with \
the given item."

Begin["`Private`"]

prefixes = "PREFIX owl: <http://www.w3.org/2002/07/owl#>
  PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
  PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
  PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
  PREFIX foaf: <http://xmlns.com/foaf/0.1/>
  PREFIX dc: <http://purl.org/dc/elements/1.1/>
  PREFIX : <http://dbpedia.org/resource/>
  PREFIX dbpedia2: <http://dbpedia.org/property/>
  PREFIX dbpedia: <http://dbpedia.org/>
  PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
  PREFIX dbo: <http://dbpedia.org/ontology/>
  ";

typesQuery[item_] := prefixes <> "
  SELECT ?label WHERE {
      :" <> StringReplace[item, " " -> "_"] <> " rdf:type ?type .
      ?type rdfs:label ?label .
  }"

propertiesQuery[item_] := prefixes <> "
  SELECT DISTINCT ?label WHERE {
      :" <> StringReplace[item, " " -> "_"] <> " ?property ?value .
      ?property rdf:type rdf:Property .
      ?property rdfs:label ?label .
  }"

itemQuery[label_, properties_] := prefixes <> "
  SELECT ?item" <> StringJoin[" ?" <> # & /@ properties] <> " WHERE {
      ?item rdfs:label \"" <> label <> "\"@en .
  " <> StringJoin["    ?" <> # <> "Prop rdfs:label \"" <> # <> "\"@en .
          ?item ?" <> # <> "Prop ?" <> # <> " .\n" & /@ properties] <>
   "}"

collectionQuery[label_, properties_] := prefixes <> "
  SELECT ?item ?name" <> StringJoin[" ?" <> # & /@ properties] <> 
  " WHERE {
      ?type rdfs:label \"" <> label <> "\"@en .
      ?item a ?type .
      ?item rdfs:label ?name .
  " <> StringJoin["    ?" <> # <> "Prop rdfs:label \"" <> # <> "\"@en .
          ?item ?" <> # <> "Prop ?" <> # <> " .\n" & /@ properties] <>
   "
      FILTER ( lang(?name) = \"en\" )
  }"

getResults[query_] := 
 Import["http://live.dbpedia.org/sparql?default-graph-uri=" <> 
   urlEncode@"http://dbpedia.org" <> "&query=" <> urlEncode@query <> 
   "&format=" <> urlEncode@"application/sparql-results+json" <> 
   "&timeout=30000", "JSON"]

Data[label_, properties_List] := 
 If[Length@# > 0, 
    "value" /. #[[All, Range[2, 1 + Length@properties], 2]], 
    "value" /. 
     getResults[collectionQuery[label, properties]][[2, 2, 1, 2, All, 
       Range[2, 2 + Length@properties], 2]]] &@
  getResults[itemQuery[label, properties]][[2, 2, 1, 2]]

Data[label_, property_] := Data[label, {property}]

Types[item_] := 
 Cases[Import[
   "http://live.dbpedia.org/sparql?default-graph-uri=" <> 
    urlEncode@"http://dbpedia.org" <> "&query=" <> 
    urlEncode@typesQuery@item <> "&format=" <> 
    urlEncode@"application/sparql-results+json" <> "&timeout=30000", 
   "JSON"], ("label" -> {_, "value" -> a_, "xml:lang" -> "en"}) -> a, 
  6]

Data[item_, "Types"] := Types@item

Data[item_, "Properties"] := 
 Cases[Import[
   "http://live.dbpedia.org/sparql?default-graph-uri=" <> 
    urlEncode@"http://dbpedia.org" <> "&query=" <> 
    urlEncode@propertiesQuery@item <> "&format=" <> 
    urlEncode@"application/sparql-results+json" <> "&timeout=30000", 
   "JSON"], ("label" -> {_, "value" -> a_, "xml:lang" -> "en"}) -> a, 
  6]

urlEncode[string_String] := 
 StringReplace[string, 
  c : Except@
     Flatten@{CharacterRange @@@ {{"A", "Z"}, {"a", "z"}, {"0", "9"}},
        Characters["-_.~"]} :> 
   StringJoin[
    "%" <> IntegerString[#, 16, 2] & /@ ToCharacterCode[c, "UTF-8"]]]

End[]
EndPackage[]