3

我正在尝试在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
4

3 回答 3

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 端点之间建立某种缓存机制。

于 2011-06-08T15:04:49.820 回答
2

不要尝试一次获取整个数据集!添加一个LIMIT和一个OFFSET子句并使用它们对数据进行分页。

添加后,LIMIT 50我几乎立即为您的查询返回了结果,我设法将限制提高了很多,并且仍然得到了响应,所以请尝试一下。找到适合您的页面大小后,只需使用 an 重复查询,OFFSET直到没有更多结果,例如

SELECT * WHERE { ... } LIMIT 100
SELECT * WHERE { ... } LIMIT 100 OFFSET 100
...
于 2011-06-09T05:34:51.493 回答
2

如果您知道确切的 URI(例如来自先前的查询),那么将 URI 直接放在 where 子句中比将 URI 放在 FILTER 中更快(至少根据我的经验)。

例如,更喜欢:

WHERE { <http:/...> ... }

超过

WHERE { ?uri .... FILTER (?uri...)

此外,我发现 UNION 的执行速度实际上比旨在匹配多个资源的过滤器更快。

仅仅因为我们现在在做 SPARQL 并不意味着我们可以忘记 SQL 调优的噩梦,欢迎来到 SPARQL 调优的精彩世界!:)

于 2011-06-20T00:56:25.750 回答