我正在尝试在http://dbpedia.org/sparql上运行此查询,但是我收到的错误是我的查询太贵了。当我通过http://dbpedia.org/snorql/运行查询时,我得到:
The estimated execution time 25012730 (sec) exceeds the limit of 1500 (sec) ...
使用SPARQLWrapper通过我的python脚本运行查询时,我只需获得HTTP 500。
我想我需要做一些事情来优化我的SPARQL查询。我需要将数据迭代到教育机构并将其导入本地数据库,也许我使用SPARQL错误,并且应该以一种根本不同的方式执行此操作。
希望有人可以帮助我!
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
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#>
SELECT DISTINCT ?uri
?name
?homepage
?student_count
?native_name
?city
?country
?type
?lat ?long
?image
WHERE {
?uri rdf:type dbpedia-owl:EducationalInstitution .
?uri foaf:name ?name .
OPTIONAL { ?uri foaf:homepage ?homepage } .
OPTIONAL { ?uri dbpedia-owl:numberOfStudents ?student_count } .
OPTIONAL { ?uri dbpprop:nativeName ?native_name } .
OPTIONAL { ?uri dbpprop:city ?city } .
OPTIONAL { ?uri dbpprop:country ?country } .
OPTIONAL { ?uri dbpprop:type ?type } .
OPTIONAL { ?uri geo:lat ?lat . ?uri geo:long ?long } .
OPTIONAL { ?uri foaf:depiction ?image } .
}
ORDER BY ?uri
LIMIT 20 OFFSET 10
答案 0 :(得分:3)
算了。只使用一个SPARQL,您将无法从dbpedia返回该查询。那些期权非常昂贵。
要解决这个问题,你需要先运行类似的东西:
SELECT DISTINCT ?uri WHERE {
?uri rdf:type dbpedia-owl:EducationalInstitution .
?uri foaf:name ?name .
} ORDER BY ?uri
LIMIT 20 OFFSET 10
然后迭代此查询的结果集以形成每个dbpedia-owl:EducationalInstitution
的单个查询,例如...(注意查询末尾的过滤器):
SELECT DISTINCT ?uri
?name
?homepage
?student_count
?native_name
?city
?country
?type
?lat ?long
?image
WHERE {
?uri rdf:type dbpedia-owl:EducationalInstitution .
?uri foaf:name ?name .
OPTIONAL { ?uri foaf:homepage ?homepage } .
OPTIONAL { ?uri dbpedia-owl:numberOfStudents ?student_count } .
OPTIONAL { ?uri dbpprop:nativeName ?native_name } .
OPTIONAL { ?uri dbpprop:city ?city } .
OPTIONAL { ?uri dbpprop:country ?country } .
OPTIONAL { ?uri dbpprop:type ?type } .
OPTIONAL { ?uri geo:lat ?lat . ?uri geo:long ?long } .
OPTIONAL { ?uri foaf:depiction ?image } .
FILTER (?uri = <http://dbpedia.org/resource/%C3%89cole_%C3%A9l%C3%A9mentaire_Marie-Curie>)
}
从第一个查询中获取<http://dbpedia.org/resource/%C3%89cole_%C3%A9l%C3%A9mentaire_Marie-Curie>
的位置。
...是的,它会很慢,你可能无法为在线应用程序运行它。建议:尝试在您的应用程序和dbpedia SPARQL端点之间设置某种缓存机制。
答案 1 :(得分:2)
不要尝试立即获取整个数据集!添加LIMIT
和OFFSET
子句,并使用这些子句翻阅数据。
添加LIMIT 50
后,我几乎立即得到了您的查询结果,我设法将限制提高了很多,并且仍然得到响应,所以玩它。找到适合您的页面大小后,只需使用OFFSET
重复查询,直到获得更多结果为止。
SELECT * WHERE { ... } LIMIT 100
SELECT * WHERE { ... } LIMIT 100 OFFSET 100
...
答案 2 :(得分:1)
如果你知道确切的URI(例如来自之前的查询),那么将URI直接放在where子句中比将URI放在FILTER中更快(至少在我的经验中)。
例如,更喜欢:
WHERE { <http:/...> ... }
在
WHERE { ?uri .... FILTER (?uri...)
此外,我发现UNION的实际执行速度比设计用于匹配多种资源的过滤器要快。
仅仅因为我们现在正在做SPARQL并不意味着我们可以忘记SQL调优的噩梦,欢迎来到SPARQL调优的精彩世界! :)