Получить отдельные предикаты и извлечь префикс из предикатов в RDF

У меня есть файл .ttl. Я хочу извлечь из него все отдельные предикаты. Я использую Apache-jena. Для этого я использовал эту команду SPARQL:

"SELECT DISTINCT ?property WHERE {" +
            " ?s ?property ?o ."
            + "}";

И я получаю результат, что-то вроде этого:

<http://something.dk/ontology/business/name <http://something.dk/ontology/business/id

Я хочу избавиться от этого префикса,

<http://something.dk/ontology/business/

и получить только name и id в качестве предикатов, которые будут использоваться для получения их значения объекта соответственно. На данный момент я делаю это:

"prefix j.0`<http://something.dk/ontology/business/>" +
            "select ?a ?b where {" +
            " ?Name j.0:name ?a ."
            + " ?Name j.0:id ?b ."
            + "}";

Но это неэффективно, так как могут быть некоторые другие свойства. Как я могу получить все предикаты из модели без префиксов и использовать эти предикаты для получения значений объекта?


person The Madman    schedule 30.06.2017    source источник
comment
Вы знаете, как делать замены регулярных выражений? вы можете сделать это в SPARQL... т. е. вы можете преобразовать свои предикаты в строки и заменить что-то. dk/ontology/business с пустой строкой. Но я бы этого не советовал. Разве в вашей онтологии нет ярлыков? Напишите запрос, чтобы получить метку ?property и вернуть ее. Или создайте свои собственные ярлыки. Не выполняйте подстановку регулярных выражений, за исключением чрезвычайных ситуаций.   -  person Mark Miller    schedule 01.07.2017
comment
Здесь несколько раз спрашивали и отвечали, но я не могу найти правильную ссылку. Идея состоит в том, чтобы использовать операции со строками: BIND(STRAFTER(STR(?property), j.0:) AS ?pLabel) и выбрать ?pLabel `   -  person UninformedUser    schedule 01.07.2017
comment
@МаркМиллер <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.2017
comment
В Jena также существует пользовательская функция afn:localname(…).   -  person Stanislav Kralin    schedule 01.07.2017


Ответы (1)


Все ваши 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() — это удобная функция, поэтому вам не нужно вводить это регулярное выражение replacement: REPLACE(STR(?x), "^(.*)(/&#124;#)([^#/]*)$", "$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