SPARQL:按对象类型拆分一个变量

SPARQL: Split one variable by object type

我有一些 RDF 数据,看起来像这样:

WatchObject -subclassOf-> Accessory
BagObject -subclassOf-> Accessory
Person -hasAccessory-> Accessory

其中 WatchObject 和 BagObject 都是 "Accessory" 的子类,与 Person 有关系 has(is)Accessory(of)。

我现在想查询它以在单独的变量中得到一个人的手表和包。所以我想到了类似的东西:

SELECT DISTINCT ?person ?watch ?bag
WHERE {
    ?person rdf:type x:Person .
    ?person x:hasAccessory ?bag^^x:BagObject .
    ?person x:hasAccessory ?watch^^x:WatchObject .
}

是否可以在 SPARQL 查询中表达类似的内容?另一个问题是像这样对我的数据建模是否合理,或者像这样再添加两个 ObjectProperties 会更好吗?

WatchObject -subclassOf-> Accessory
BagObject -subclassOf-> Accessory
Person -hasAccessory-> Accessory
Person -hasWatch-> WatchObject
Person -hasBag-> BagObject

您只需添加指定 ?bag 和 ?watch 变量类型的三元组,就像您为 ?person 变量指定类型一样:

SELECT DISTINCT ?person ?watch ?bag {
    ?person a x:Person .
    ?person x:hasAccessory ?bag .
    ?bag a x:BagObject .
    ?person x:hasAccessory ?watch .
    ?watch a x:WatchObject .
}

请注意,这将得到包和手表的叉积;即,您将获得一个人的包和手表的每种组合。此外,它要求此人至少有一个包和至少一只手表,否则查询将不匹配。您可能会查看 optional 以了解如何将这些设为可选。

Another question would be if it's reasonable to model my data like this, or would it be better to add two more ObjectProperties like this?

WatchObject -subclassOf-> Accessory
BagObject -subclassOf-> Accessory
Person -hasAccessory-> Accessory
Person -hasWatch-> WatchObject
Person -hasBag-> BagObject

你也可以这样做。如果你这样做,那么添加三元组也可能很好:

hasWatch rdfs:subPropertyOf hasAccessory
hasBag   rdfs:subPropertyOf hasAccessory

然后,如果您启用了推理,或者稍微调整了查询​​,那么您仍然可以仅使用 hasAccessory 属性.

来检索内容