【发布时间】:2018-04-23 00:33:34
【问题描述】:
我有一个相当复杂的 Sparql 查询,我不知道如何编写。这是本体的简化背景:
“水果”类具有“苹果”和“芒果”子类。另一类“营养”有子类“维生素”和“纤维”。 “fruit_has_nutrition”是具有域“Fruit”和范围“Nutrition”的属性。
然后我创建了以下实例:
Apple_1、Mango_1、Vitamin_1、Vitamin_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" ;.
假设一个水果实例可以包含尽可能多的营养,但对于每种,它应该只包含该营养的一个实例。如果是这种情况,Apple_1 就违反了假设,因为它有两个 Fiber 实例。
因此,我要写的查询是“给我所有具有多种相同营养成分的水果,并给我这些营养成分的类型”。有了上面的数据,应该还给我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 .
}
}
}
但这最终什么也没给我。
有没有办法按两个变量分组?我还能怎么写这个查询?
非常感谢!!
【问题讨论】:
-
嗯;你需要一个 2 的聚合值,但由于我不熟悉这种语法,所以我只能提供一种 SQL 方法,如果它没用,我会将它作为答案删除。