RDF4J 没有以预期的方式过滤 TreeModel

RDF4J not filtering TreeModel in expected way

我有一个 TTL,类似

ex:isDataProperty rdf:type owl:DatatypeProperty .

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

并且当我使用 RDF4J(作为 TreeModel)加载模型时,然后尝试过滤以提取用 haskey 注释的属性失败(只是 returns 空列表结果)

一些样本 return 数据:

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

我要的样本,没有return数据:

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

我使用 RDF.TYPE 或 RDF.Value 尝试了前一个变体的一些变体。 (而不是 RDF.PROPERTY)

您所追求的是任何具有 owl:hasKey 属性 的主题,无论其价值如何。所以主语和宾语都是通配符,你只要按属性名字过滤即可。方法是这样的:

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

现在,您还说您想知道使用此 owl:hasKey 属性 用作注释的属性。在您的示例中,那将是 ex:isDataProperty。请注意,在您的模型中,这不是 owl:hasKey 关系的主题 - 它在对象值中:

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

更复杂的是,您的示例中的对象值不仅仅是单个值。相反,每个 class 都使用 list 属性进行注释,因此对象值是一个列表对象(a.k.a。一个 RDF 集合)。要处理此列表,ModelsRDFCollections classes 提供了一些实用方法。

对于每个对象,您都可以执行此操作以获取实际的值列表:

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

(其中 objectNode.objects() 返回的值之一)

编辑 因为 objects() returns 类型的对象 ValueRDFCollections 需要一个 Resource,你要么必须进行转换,要么如果您想以流畅的方式完成所有这些操作,则可以改用 Models.objectResources。整个事情就变成了:

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

(我可能有 Scala-specific 部分错误,但希望您能理解要点)

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