1

我有一个类似的 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)

4

1 回答 1

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()返回类型的对象ValueRDFCollections期望 a Resource,您要么必须进行强制转换,要么如果您想以流利的方式完成所有这些,您可以使用Models.objectResources。整个事情就变成了:

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

(我可能有这个错误的特定于 Scala 的部分,但希望你能明白要点)

有关如何使用 rdf4j 模型 API 和 RDF 集合的更多信息,请参阅rdf4j 文档

于 2019-07-11T01:32:47.310 回答