如何在sparql查询中删除重复项

如何在sparql查询中删除重复项,sparql,dbpedia,Sparql,Dbpedia,我写了这个查询和返回夫妇和特殊条件的列表。(in) 问题是有些行是重复的。 例如: 十二, 十二, 如何消除这些重复? 我在?actor中添加了性别,但它破坏了当前的结果。当然,它不是实际的副本,因为您可以从两个方面看它。如果您想修复它,可以添加一个过滤器。这是一个有点肮脏的黑客,但它只承担了2行是“相同的” SELECT DISTINCT?actor?person2?cnt 哪里 { { 选择不同的演员2(将电影计数为cnt) 何处{ ?电影dbo:主演?演员。 演员dbo:配偶?个人2。 ?

我写了这个查询和返回夫妇和特殊条件的列表。(in)

问题是有些行是重复的。 例如:

十二,

十二,

如何消除这些重复?
我在?actor中添加了性别,但它破坏了当前的结果。

当然,它不是实际的副本,因为您可以从两个方面看它。如果您想修复它,可以添加一个过滤器。这是一个有点肮脏的黑客,但它只承担了2行是“相同的”

SELECT DISTINCT?actor?person2?cnt
哪里
{
{
选择不同的演员2(将电影计数为cnt)
何处{
?电影dbo:主演?演员。
演员dbo:配偶?个人2。
?电影dbo:主演?人物2。
过滤器(?执行器<?人员2)
}
演员的命令
}
过滤器(?cnt>9)
}
显示了排除此类伪重复的典型方法。结果实际上并不是重复的,因为在一个例子中,乔治·伯恩斯是演员,而在另一个例子中,他是人。在许多情况下,您可以添加一个过滤器来要求这两件事情都是有序的,这将删除重复的情况。例如,当您有以下数据时:

:a :likes :b .
:a :likes :c .
你在寻找什么

选择?x?y,其中{
:a:像?x,?y。
}
您可以添加过滤器(?x<?y)以强制执行?x和?y之间的排序,这将删除这些伪重复项。然而,在本例中,这有点棘手,因为?actor和?person2没有使用相同的标准。如果DBpedia包含

:PersonB dbo:spouse :PersonA
但不是

:PersonA dbo:spouse :PersonB
那么这个简单的过滤器就不起作用了,因为你永远找不到主体角色小于客体角色的三元组。因此,在本例中,您还需要稍微修改查询以使条件对称:

选择不同的演员配偶(计数(?胶片)作为计数){
电影dbo:主演演员、配偶。
?演员dbo:配偶| ^dbo:配偶?配偶。
过滤器(?参与者<?配偶)
}
按演员?配偶分组
具有(计数(?胶片)>9)
演员的命令

(此查询还显示,此处不需要子查询,您可以使用having对聚合值进行“筛选”。)但重要的部分是使用属性路径dbo:party | ^dbo:party来查找?party的值,以便?actor dbo:party?party?party dbo:party?actor。这使得关系对称,因此即使关系仅在一个方向上声明,也可以保证获得所有对。

我也想到了这一点,但这还不够,因为可能三元组在两个方向上都不存在。这可能会找不到解决方案。对。这只适用于假设完整数据或推断的情况。我添加了一个例子,说明了如何在不进行推断的情况下做到这一点(并且不需要子查询)。很好。您甚至可以将该解决方案推广到任何反向属性关系。
:PersonB dbo:spouse :PersonA
:PersonA dbo:spouse :PersonB