我有一个相当复杂的Sparql查询,我不知道怎么写。这是本体的简化背景:
课程"水果"有子类" Apple"和"芒果"。另一课"营养"有子类"维生素"和" Fiber"。 " fruit_has_nutrition"是一个拥有域名" Fruit"和范围"营养"。
然后我创建了以下实例:
Apple_1,Mango_1,维生素_1,维生素_2,Fiber_1和Fiber_2,Fiber_3。
以下是Apple_1和Mango_1的样子:
fruit:Apple_1
rdf:type fruit:Apple ;
fruit:fruit_has_nutrition fruit:Fiber_1 ;
fruit:fruit_has_nutrition fruit:Fiber_2 ;
fruit:fruit_has_nutrition fruit:Vitamin_1 ;
rdfs:label "Apple 1" ;.
fruit:Mango_1
rdf:type fruit:Mango ;
fruit:fruit_has_nutrition fruit:Fiber_3 ;
fruit:fruit_has_nutrition fruit:Vitamin_2 ;
rdfs:label "Mango 1" ;.
假设一个水果的实例可以包含尽可能多的营养,但对于每种类型,它应该只包含1个营养的实例。如果是这种情况,Apple_1违反了这一假设,因为它有两个光纤实例。
因此,我想写的查询是#34;给我所有具有多种同类营养的水果,并给我这些营养的类型"。根据上面的数据,它应该会让我回到Apple_1和Fiber。
挑战的部分是我不能只是GROUP BY rdf:type因为它失去了对各种水果的区别。我尝试了MINUS(所有水果 - 水果没有违规):
SELECT
WHERE {
?fruit fruit:fruit_has_nutrition ?nutrition .
?nutrition rdf:type ?type .
MINUS {SELECT DISTINCT ?fruit ?type
WHERE {
?fruit fruit:fruit_has_nutrition ?nutrition .
?nutrition rdf:type ?type .
}
}
}
但最终没有给我什么。
有没有办法按两个变量分组?我怎么能写这个查询?
非常感谢!!
答案 0 :(得分:2)
也许我不明白这个问题,但为什么你不能用fuit类型分组呢?
像往常一样,没有可用于测试的最小样本数据,因此,未经测试的查询可能是错误的:
select ?fruit ?fruit_type {
?fruit fruit:fruit_has_nutrition ?nutrition .
?nutrition rdf:type ?fruit_type .
}
group by ?fruit ?fruit_type
having (count(?nutrition) > 1)
答案 1 :(得分:0)
如果没有尝试想要的语法,这是在SQL
中解决它的一种方法select *
from fruits f
inner join (
select fruit,nutrition
from fruits
group by fruit,nutrition
having count(*) > 1
) dups on f.fruit = dups.friuits and f.nutrition = dups.nutrition