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 属性.
来检索内容
我有一些 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 属性.
来检索内容