Невозможно извлечь тройной RDF с помощью локально определенного предиката
Возможно, я просто не могу понять основную идею онтологий, но вот мой вопрос. Я пытаюсь извлечь тройки из хранилища 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 ответа
Это неверно:
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.
Я подозреваю, что ваша проблема в том, что вы не пытаетесь сопоставить правильный 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