我有一些看起来像这样的RDF数据:
WatchObject -subclassOf-> Accessory
BagObject -subclassOf-> Accessory
Person -hasAccessory-> Accessory
WatchObject和BagObject都是" Accessory"的子类,其关系具有(是)附件(of)与Person。
我想现在查询它以获得一个人的手表和包在单独的变量。所以我想到了类似的东西:
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
答案 0 :(得分:0)
你只需要添加三元组,指定一个?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 .
}
请注意,这将为您提供包包和手表的交叉产品;也就是说,你会得到一个人的手提包和手表的每个组合。此外,它要求此人至少有一个包和至少一个手表,否则查询将不匹配。您可以查看可选以了解如何使这些可选。
另一个问题是,如果对我的数据进行建模是合理的 这个,或者更好的是再添加两个ObjectProperties 此?
WatchObject -subclassOf-> Accessory BagObject -subclassOf-> Accessory Person -hasAccessory-> Accessory Person -hasWatch-> WatchObject Person -hasBag-> BagObject
你也可以这样做。如果你这样做,那么添加三元组也可能是好的:
hasWatch rdfs:subPropertyOf hasAccessory
hasBag rdfs:subPropertyOf hasAccessory
然后,如果你启用了推理,或者你稍微调整了一下你的查询,那么你仍然只能使用一个hasAccessory属性来检索。