2016-10-27 6 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

Спасибо за ваши предложения. Я пробовал этот подход с помощью перекрестного продукта, но он значительно замедляет мои запросы. В результате я создал дополнительные свойства hasWatch/hasBag как подзадачи hasAccessory, как вы предложили. – del123

+0

Хорошо, вам не нужно приобретать крестик. Вы все еще можете использовать что-то вроде первого подхода. –