2016-10-27 42 views
0

我有看起來像這樣的一些RDF數據:SPARQL:按對象類型拆分一個變量

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

凡WatchObject和BagObject是「附屬應用程序」,它有關係有兩個子類(是)與人配合。

我想查詢它現在得到一個人手錶和行李分開變量。所以我想到了類似於:

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

你只需要添加三元組指定類型的包包和手錶的變量,就像你指定的人變量類型:???

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屬性。

+0

感謝您的建議。我嘗試了交叉產品的方法,但它減慢了我的查詢。正如你所建議的,我最終創建了hasAccessory的子屬性作爲額外的hasWatch/hasBag屬性。 – del123

+0

好吧,你不必交叉產品,但。你仍然可以使用第一種方法。 –