Невозможно извлечь тройной RDF с помощью локально определенного предиката - PullRequest
3 голосов
/ 22 августа 2011

Возможно, я просто не могу понять основную идею онтологий, но вот мой вопрос.Я пытаюсь извлечь тройки из хранилища RDF (используя 4store, но также пробовал XML ArmyKnife) с помощью запроса SPARQL, задающего предикат, и получаю пустые результаты.

Чтобы быть уверенным, что я ничего не испортилСинтаксис RDF Я использую сгенерированные LUBM данные (урезанные до размера, подходящего для примера).

<?xml version="1.0" encoding="UTF-8" ?>
<rdf:RDF
  xml:base = "http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl"
  xmlns:rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" 
  xmlns:owl="http://www.w3.org/2002/07/owl#"
  xmlns:ub="univ-bench.owl#"
>

<owl:DatatypeProperty rdf:ID="name">
  <rdfs:label>name</rdfs:label>
</owl:DatatypeProperty>

<owl:Class rdf:ID="Organization">
  <rdfs:label>organization</rdfs:label>
</owl:Class>

<owl:Class rdf:ID="University">
  <rdfs:label>university</rdfs:label>
  <rdfs:subClassOf rdf:resource="#Organization" />
</owl:Class>

<ub:University rdf:about="http://www.University0.edu">
   <ub:name>University0</ub:name>
</ub:University>

</rdf:RDF>

Затем я запускаю запрос, чтобы посмотреть, какие троекна моя база данных фактически содержит после импорта:

SELECT * WHERE {?s ?p ?o} ORDERBY ?s

Вот результат:

<http://www.University0.edu>    <univ-bench.owl#name>   "University0"
<http://www.University0.edu>    <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>       <univ-bench.owl#University>
<http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#Organization>         <http://www.w3.org/2000/01/rdf-schema#label>    "organization"
<http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#Organization>     <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>       <http://www.w3.org/2002/07/owl#Class>
<http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#University>       <http://www.w3.org/2000/01/rdf-schema#subClassOf>       <http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#Organization>
<http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#University>       <http://www.w3.org/2000/01/rdf-schema#label>    "university"
<http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#University>       <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>       <http://www.w3.org/2002/07/owl#Class>
<http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#name>     <http://www.w3.org/2000/01/rdf-schema#label>    "name"
<http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#name>     <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>       <http://www.w3.org/2002/07/owl#DatatypeProperty>

Ясно видно, что у меня есть предикат <univ-bench.owl#name> как часть первой тройки.

Тем не менее следующий запрос не возвращает результатов:

SELECT * WHERE {?s <univ-bench.owl#name> ?o}

Я пробовал десятки комбинаций, с пространствами имен и без, но не могу заставить его работать.Кто-нибудь может объяснить, почему движок RDF не находит предикат, который явно существует?

Кстати, извлечение той же тройки с помощью OBJECT = "University0" работает нормально.

Ответы [ 2 ]

6 голосов
/ 22 августа 2011

Это недопустимо:

xmlns:ub="univ-bench.owl#"

URI пространства имен должен быть абсолютным в RDF / XML.(Они могут быть относительными в других синтаксисах, таких как Turtle, но не в RDF / XML.) Если ваш пример действительно сгенерирован напрямую LUBM, то LUBM не работает.Это должно работать:

xmlns:ub="http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#"

Тогда, конечно, вам нужно сопоставить этот URI в запросе SPARQL, как сказал @RobV.

5 голосов
/ 22 августа 2011

Я подозреваю, что ваша проблема в том, что вы не пытаетесь сопоставить правильный URI в вашем запросе:

SELECT * WHERE {?s <univ-bench.owl#name> ?o}

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

Вам нужно либо указать полный URI следующим образом:

SELECT * WHERE {?s <http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#name> ?o}

, либо использовать префикс, например, так:

PREFIX ub: <univ-bench.owl#>
SELECT * WHERE { ?s ub:name ?o }

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

Вы можете сделать это с помощью xml:base="http://example.org" в RDF / XML или с помощью BASE <http://example.org/> в SPARQL.Если я использую 4store, я считаю, что их командная строка импортера имеет аргументы, которые можно использовать для установки базового URI по умолчанию, когда ни один не указан.

Другая вещь, которую вы можете сделать, это попытаться поместить ваши данные в другуюТройное хранилище и посмотрите, испытываете ли вы такое же поведение, если вы это сделаете, то это будет означать проблему с относительными и абсолютными URI, как я предлагал.Если другое хранилище ответит на запрос нормально, это может означать возможную ошибку в 4store, и в этом случае вам следует связаться с ними в их списке рассылки - http://groups.google.com/group/4store-support

...