如何编写Sparql查询以检查重复项而不使用GROUP BY?

时间:2017-11-09 21:12:56

标签: mysql sparql ontology

我有一个相当复杂的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 .
                        }
                }
} 

但最终没有给我什么。

有没有办法按两个变量分组?我怎么能写这个查询?

非常感谢!!

2 个答案:

答案 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