Все ваши URI-предикаты содержат слово "онтология"... у вас действительно есть онтология? Вы понимаете, что онтология отличается от любых триплетов связанных данных в произвольной форме? Где класс <http://something.dk/ontology/business/village>
и предикат <http://something.dk/ontology/business/population>
определены?
Другими словами, для этих троек данных:
prefix : <http://something.dk/ontology/business/>
<http://something.dk/resource/business/community/326> :name "Akalia" ;
a :village ;
:id "326" ;
:population "2000" ;
:area "30" .
Я ожидаю увидеть по крайней мере следующую минимальную онтологию:
prefix : <http://something.dk/ontology/business/> .
prefix owl: <http://www.w3.org/2002/07/owl#> .
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
:madman.owl rdf:type owl:Ontology .
:area rdf:type owl:DatatypeProperty ;
rdfs:label "area" .
:id rdf:type owl:DatatypeProperty ;
rdfs:label "id" .
:name rdf:type owl:DatatypeProperty ;
rdfs:label "name" .
:area rdf:type owl:DatatypeProperty ;
rdfs:label "area" .
:village rdf:type owl:Class ;
rdfs:label "village" .
Если вы загрузите и данные, и онтологию в тройное хранилище, такое как Jena Fuseki, этот запрос:
PREFIX : <http://something.dk/ontology/business/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?v ?l ?o
WHERE
{ ?v a :village ;
?p ?o .
?p rdfs:label ?l
}
Возвращает этот результат:
+-----------------------------------------------------+------+--------+
| v | l | o |
+-----------------------------------------------------+------+--------+
| http://something.dk/resource/business/community/326 | id | 326 |
| http://something.dk/resource/business/community/326 | area | 30 |
| http://something.dk/resource/business/community/326 | name | Akalia |
+-----------------------------------------------------+------+--------+
Если вы используете один из других способов Jena для доступа к содержимому RDF, вы можете использовать тот же запрос, но вам придется использовать другой метод для объединения троек данных и троек из онтологии.
Комментарий @AKSW - это один из способов удаления подстроки для этой конкретной задачи. В частности, мы удаляем содержимое префикса :
по умолчанию из каждого URI. Более общая функция — replace()
.
Я никогда не видел, чтобы @AKSW давал плохие советы, но я действительно призываю вас привыкнуть использовать как правильную онтологию, а не обходной путь манипуляции со строками.
PREFIX : <http://something.dk/ontology/business/>
SELECT ?v ?extrLabel ?o
WHERE
{ ?v a :village ;
?p ?o
BIND(strafter(str(?p), str(:)) AS ?extrLabel)
}
@Станислав тоже знает свое дело. Мне кажется, что afn:localname()
— это удобная функция, поэтому вам не нужно вводить это регулярное выражение replace
ment: REPLACE(STR(?x), "^(.*)(/|#)([^#/]*)$", "$3")
PREFIX : <http://something.dk/ontology/business/>
PREFIX afn: <http://jena.apache.org/ARQ/function#>
SELECT ?v ?extrLabel ?o
WHERE
{ ?v a :village ;
?p ?o
BIND(afn:localname(?p) AS ?extrLabel)
}
Забавным упражнением было бы получение или синтез многих тысяч троек, как вы предоставили, и определение времени производительности этих трех разных методов маркировки.
Кроме того, с помощью онтологии вы можете установить домен и диапазоны для свойств вашего типа данных, например population
. На мой взгляд, это должно быть xsd:integer
, а не нетипизированная строка.
person
Mark Miller
schedule
01.07.2017
BIND(STRAFTER(STR(?property), j.0:) AS ?pLabel)
и выбрать?pLabel
` - person UninformedUser   schedule 01.07.2017<http://something.dk/resource/business/community/326> <http://something.dk/ontology/business/name> "Akalia" ; a <http://something.dk/ontology/business/village> ; <http://something.dk/ontology/business/id> "326" ; <http://something.dk/ontology/business/population> "2000" ; <http://something.dk/ontology/business/area> "30" .
- person The Madman   schedule 01.07.2017afn:localname(…)
. - person Stanislav Kralin   schedule 01.07.2017