【问题标题】:How to write a Sparql query for checking duplicates without using GROUP BY?如何在不使用 GROUP BY 的情况下编写 Sparql 查询来检查重复项?
【发布时间】: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 方法,如果它没用,我会将它作为答案删除。

标签: mysql sparql ontology


【解决方案1】:

也许我不明白这个问题,但你为什么不能按 fuit type 分组呢?

像往常一样,没有可用于测试的最小样本数据,因此,未经测试的查询可能是错误的:

select ?fruit ?fruit_type {
  ?fruit fruit:fruit_has_nutrition ?nutrition .
  ?nutrition rdf:type ?fruit_type .
}
group by ?fruit ?fruit_type
having (count(?nutrition) > 1)

【讨论】:

  • 非常感谢!!有用!赞赏!我想我之前遇到了一些括号问题!非常抱歉!
  • 没问题。如果它提供了正确的解决方案,请不要忘记“接受”这个答案。
  • 您的问题现在解决了吗?你对这个答案还有疑问吗?要接受答案“Click the Tick”了解更多信息,请参阅help/accepting
  • 是的,问题解决了!非常感谢大家!
【解决方案2】:

不尝试想要的语法,这是在 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 

【讨论】:

    猜你喜欢
    • 2022-01-03
    • 1970-01-01
    • 2021-12-30
    • 2013-10-09
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多