Переписать запрос SPARQL DESCRIBE как CONSTRUCT - PullRequest
4 голосов
/ 08 июня 2011

По какой-то причине я не могу выдавать запросы DESCRIBE с использованием Redland (librdf.org), возможно ли переписать DESCRIBE в качестве запроса CONSTRUCT для данного URI?

DESCRIBE <urn:my-uri>

Я думал о том, чтобы записать его в нечто подобное, но я не думаю, что это действительно в SPARQL

CONSTRUCT  { ?subject ?predicate ?object }
WHERE      { 
               { ?subject ?predicate ?object } 
               AND { 
                   { <urn:my-uri> ?predicate ?object } 
                   OR { ?subject <urn:my-uri> ?object } 
                   OR { ?subject ?predicate <urn:my-uri> } 
               } 
           }

Ответы [ 2 ]

3 голосов
/ 30 января 2014

Попробовав что-то вроде FILTER ( A || B ) метода, у меня сложилось впечатление, что он довольно медленный.

Я думаю, что вы можете сделать то же самое, в основном, но с использованием VALUES и UNION

Я попробовал это на DBPedia ( ~ 2,46 миллиарда триплетов ) с фильмом, и, похоже, он показал себя хорошо.

CONSTRUCT {
    ?subject ?predicate ?object
}
WHERE {
   { ?subject ?predicate ?object . 
       VALUES ?subject { dbpedia:The_Matrix }
   }
   UNION 
   { ?subject ?predicate ?object . 
       VALUES ?object { dbpedia:The_Matrix }
   }
}

sparql результат на dbpedia


Редактировать: Ради дополнительной информации, я думаю, вы могли бы технически написать также:

CONSTRUCT { ?subject ?predicate ?object }
WHERE {
       ?subject ?predicate ?object . 
       OPTIONAL { dbpedia:The_Matrix ?predicate ?object . }
       OPTIONAL { ?subject ?predicate dbpedia:The_Matrix . }
}

, но некоторые популярные базы данных RDF действительно не могут справитьсяOPTIONAL очень качественно, но умрет.

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

Вы правы, что не является действительным SPARQL.Самое близкое к вашему OR это UNION.И нет необходимости в операторе AND, каждый тройной шаблон по умолчанию является объединением, а не объединением.

Для того, что вы пытаетесь, лучше использовать FILTER, как в этом примере:

CONSTRUCT  { ?subject ?predicate ?object }
WHERE      { ?subject ?predicate ?object . 
             FILTER (  ?subject = <urn:your_uri> || ?object = <urn:your_uri>)
           } 

В некоторых системах для больших баз знаний этот запрос может быть очень дорогим.А также, если ваша база данных содержит bNodes, этот запрос не получит описание этих узлов, он получит только внутренний код.В большинстве случаев выполнение DESCRIBE вручную невозможно выполнить одним запросом, и вам придется реализовать некоторую рекурсивную логику, чтобы получить всю информацию, которая описывает URI.

...