Оптимизация SPARQL-запроса.[Расчетное время выполнения превышает предел 1500 (сек)] - PullRequest
3 голосов
/ 08 июня 2011

Я пытаюсь выполнить этот запрос на http://dbpedia.org/sparql, но получаю ошибку, что мой запрос слишком дорогой.Когда я запускаю запрос через http://dbpedia.org/snorql/, я получаю:

The estimated execution time 25012730 (sec) exceeds the limit of 1500 (sec) ...

При выполнении запроса через мой скрипт на python с использованием SPARQLWrapper я просто получаю 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

Ответы [ 3 ]

3 голосов
/ 08 июня 2011

Забудь об этом. Вы не сможете получить этот запрос из dbpedia только с одним SPARQL. Эти опции очень дороги.

Чтобы обойти это, сначала нужно запустить что-то вроде:

 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> было получено из первого запроса.

... и да, это будет медленно, и вы не сможете запустить это для онлайн-приложения. Совет: попробуйте разработать какой-нибудь механизм кэширования, который будет находиться между вашим приложением и конечной точкой SPARQL dbpedia.

2 голосов
/ 09 июня 2011

Не пытайтесь получить весь набор данных одновременно! Добавьте предложения LIMIT и OFFSET и используйте их для пролистывания данных.

С добавлением LIMIT 50 я получаю результат по вашему запросу почти мгновенно, мне удалось значительно увеличить лимит и получить ответ, поэтому поиграйте с ним. Как только вы нашли подходящий вам размер страницы, просто повторите запрос с OFFSET, пока не получите больше результатов, например

SELECT * WHERE { ... } LIMIT 100
SELECT * WHERE { ... } LIMIT 100 OFFSET 100
...
1 голос
/ 20 июня 2011

Если вам известен точный URI (например, из предыдущего запроса), то размещение URI непосредственно в предложении where быстрее (по крайней мере, по моему опыту), чем помещение URI в FILTER.

например, предпочитают:

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

над

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

Также я обнаружил, что UNION на самом деле работают быстрее, чем фильтры, разработанные для соответствия нескольким ресурсам.

То, что мы сейчас делаем SPARQL, не означает, что мы можем забыть о кошмарах настройки SQL, добро пожаловать в удивительный мир настройки SPARQL! :)

...