RDF4J не фильтрует TreeModel ожидаемым образом

У меня есть TTL с чем-то вроде

ex:isDataProperty rdf:type owl:DatatypeProperty .

ex:Article  a       owl:Class ;
        owl:hasKey  ( ex:isDataProperty ) .

И когда я загружаю модель с помощью RDF4J (как TreeModel), попытка отфильтровать, чтобы извлечь свойства, аннотированные с помощью haskey, терпит неудачу (просто возвращает пустой результат списка)

Некоторые примеры, которые возвращают данные:

val dataProperties = model.filter(null, RDF.TYPE, OWL.DATATYPEPROPERTY).subjects().asScala
val classes = model.filter(null, RDF.TYPE, OWL.CLASS).subjects().asScala

Образец, который я хочу, не возвращает данные:

    val propertiesWithKeys = model.filter(null, RDF.PROPERTY, OWL.HASKEY).subjects().asScala

Я пробовал несколько вариантов предыдущего, используя RDF.TYPE или RDF.Value. (вместо RDF.PROPERTY)


person Fernando Gonzalez Sanchez    schedule 10.07.2019    source источник
comment
Почему вы используете model.filter(null, RDF.PROPERTY, OWL.HASKEY)? Я имею в виду, что сам предикат OWL.HASKEY, поэтому он должен быть model.filter(null, OWL.HASKEY, null), чтобы получить все триплеты с этим предикатом.   -  person UninformedUser    schedule 10.07.2019
comment
и свойство не аннотировано с ним. Свойство используется в качестве ключа. Тройка RDF - это ex:Article owl:hasKey ( ex:isDataProperty ) . - это также означает, что само свойство является объектом в тройке, которая на самом деле является списком, поскольку может быть составным ключом в OWL. Таким образом, model.filter(null, OWL.HASKEY, null).objects() приведет к узлам, представляющим коллекции RDF. Как обратно преобразовать эти коллекции RDF, можно найти здесь: rdf4j.eclipse.org /documentation/programming/model/ — поэтому используйте RDFCollections.asValues или RDFCollections.getCollection с аргументами   -  person UninformedUser    schedule 10.07.2019


Ответы (1)


То, что вам нужно, — это любой предмет, который имеет свойство owl:hasKey, независимо от значения. Таким образом, и тема, и объект являются подстановочными знаками, вы просто хотите отфильтровать по имени свойства. Способ сделать это таков:

model.filter(null, OWL.HASKEY, null)

Теперь, кроме того, вы говорите, что хотите узнать свойства, которые использовались в качестве аннотации, используя это свойство owl:hasKey. В вашем примере это будет ex:isDataProperty. Обратите внимание, что в вашей модели это не является предметом отношения owl:hasKey - оно находится в значениях объекта:

model.filter(null, OWL.HASKEY, null).objects()

Чтобы еще больше усложнить ситуацию, значения объекта в вашем примере не являются просто одиночными значениями. Вместо этого каждый класс аннотируется с помощью списка свойств, поэтому значением объекта является объект-список (он же RDF-коллекция). Для обработки этого списка есть несколько служебных методов, предоставляемых классами Models и RDFCollections.

Для каждого из объектов вы можете сделать это, чтобы получить фактический список значений:

RDFCollections.asValues(model, objectNode, new ArrayList<Value>())

(где objectNode — одно из значений, возвращенных .objects())

Редактировать, так как objects() возвращает объекты типа Value, а RDFCollections ожидает Resource, вам придется либо выполнить приведение типов, либо, если вы хотите сделать все это беглым способом, вы можете вместо этого использовать Models.objectResources . Тогда все становится:

Models.objectResources(model.filter(null, OWL.HASKEY, null))
        .asScala.map(o => RDFCollections.asValues(model, o, new ArrayList[Value]()));

(Возможно, я ошибаюсь в специфических для Scala деталях, но, надеюсь, вы поняли суть)

Для получения дополнительной информации о том, как работать с API модели rdf4j и коллекциями RDF, см. документацию rdf4j. .

person Jeen Broekstra    schedule 11.07.2019