User:Wakebrdkid/DBpedia
Appearance
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[]