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 集合)。要处理此列表,Models
和 RDFCollections
classes 提供了一些实用方法。
对于每个对象,您都可以执行此操作以获取实际的值列表:
RDFCollections.asValues(model, objectNode, new ArrayList<Value>())
(其中 objectNode
是 .objects()
返回的值之一)
编辑 因为 objects()
returns 类型的对象 Value
和 RDFCollections
需要一个 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。
我有一个 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 集合)。要处理此列表,Models
和 RDFCollections
classes 提供了一些实用方法。
对于每个对象,您都可以执行此操作以获取实际的值列表:
RDFCollections.asValues(model, objectNode, new ArrayList<Value>())
(其中 objectNode
是 .objects()
返回的值之一)
编辑 因为 objects()
returns 类型的对象 Value
和 RDFCollections
需要一个 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。