RDF4J не фильтрует TreeModel ожидаемым образом - PullRequest
0 голосов
/ 10 июля 2019

У меня есть 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)

1 Ответ

1 голос
/ 11 июля 2019

То, что вам нужно, это любой предмет, обладающий свойством 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 .

...