Использование ключевого слова GRAPH в SPARQL для извлечения удаленных графиков - PullRequest
8 голосов
/ 11 февраля 2011

Я хочу использовать SPARQL для сравнительно простой задачи: учитывая график FOAF, я бы хотел проанализировать элементы, которые я там нашел, получить их теги (если они существуют), а затем использовать их в качестве новых графиков. из которого можно найти информацию об этих людях.

Так, например, вы можете представить себе простой случай использования, когда я хочу выполнить запрос SPARQL, чтобы перечислить все мои любимые продукты (согласно моему файлу FOAF), а также любимые продукты всех моих друзей.

Вот как это выглядит в данный момент. Обратите внимание, что в целях тестирования в настоящий момент все, что я пытаюсь сделать с помощью приведенного ниже запроса, - это получить имя друга через переменную? Name3. Выполнение этого запроса не возвращает никаких результатов для «graph» и «name3», хотя я знаю, что rdfs: see также ссылается на некоторые допустимые файлы RDF, из которых по крайней мере два должны иметь атрибут name. Спасибо за любой вклад, который вы можете иметь!

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?name1 ?name2 ?graph ?name3
FROM <my-rdf-file>
WHERE { 
    ?person1 foaf:knows ?person2 .
    ?person1 foaf:name ?name1 .
    ?person2 foaf:name  ?name2 .
    OPTIONAL { 
        ?person2 rdfs:seeAlso ?graph .
        GRAPH ?graph {
            ?person3 foaf:name ?name3 .         
        }   
    }       
}

Ответы [ 2 ]

5 голосов
/ 16 февраля 2011

Вместо использования LOAD, как только вы обнаружили графики, которые вам нужно включить, как в приведенном выше примере Стива, было бы разумно альтернативно использовать FROM NAMED с указанием всех соответствующих графиков в результирующем запросе, т.е.

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?name1 ?name2 ?name3
FROM <my-rdf-file>
FROM NAMED <discovered-graph-URI-1>
FROM NAMED <discovered-graph-URI-n>
WHERE { 
GRAPH <my-rdf-file> {
    ?person1 foaf:knows ?person2 .
    ?person1 foaf:name ?name1 .
    ?person2 foaf:name  ?name2 .
 }
    OPTIONAL { 
        ?person2 rdfs:seeAlso <discovered-graph-URI-1> .
        GRAPH <discovered-graph-URI-1> {
            ?person3 foaf:name ?name3 .         
        }   
        ?person2 rdfs:seeAlso <discovered-graph-URI-n> .
        GRAPH <discovered-graph-URI-n> {
            ?person3 foaf:name ?name3 .         
        }  
    }       
}

Таким образом вы решаете проблемы безопасности и вам не нужно хранить данные в вашем собственном хранилище триплетов.

5 голосов
/ 11 февраля 2011

GRAPH неявно извлекает удаленные данные в хранилище, что было бы слишком большой угрозой безопасности.В некоторых системах вы можете включить это, но это нестандартно.

Однако в SPARQL 1.1 Update есть ключевое слово LOAD, которое, тем не менее, может написать:

LOAD <uri>

Который будет извлекать график в хранилище, так что вы можете написать:

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT DISTINCT ?graph
FROM <my-rdf-file>
WHERE { 
    ?person1 foaf:knows ?person2 .
    ?person1 foaf:name ?name1 .
    ?person2 foaf:name  ?name2 .
    OPTIONAL { 
        ?person2 rdfs:seeAlso ?graph .   
    }       
}

Вставьте привязки для? Graph в набор операторов LOAD, а затем выполните исходный запрос.1010 * Примечание: в некоторых системах, например, в 4store вам нужно включить LOAD, по умолчанию это запрещено, поэтому проверьте документацию магазина, который вы используете.

...