如何在不使用 GROUP BY 的情况下编写 Sparql 查询来检查重复项?

How to write a Sparql query for checking duplicates without using GROUP BY?

我有一个相当复杂的 Sparql 查询,我不知道如何编写。这是 ontology:

的简化背景

A class "Fruit" 有子classes "Apple" 和 "Mango"。另一个 class "Nutrition" 有子 class 和 "Vitamin" 和 "Fiber"。 "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 实例。

因此,我要写的查询是"give me all the fruits which have multiple nutritions of the same kind, and give me the type of those nutritions"。有了上面的数据,它应该还给我 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 .
                        }
                }
} 

但这最终什么也没给我。

有没有办法按两个变量分组?我还能如何编写此查询?

非常感谢!!

在不尝试所需语法的情况下,这是在 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 

可能是我没看懂问题,为什么不能也按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)