为什么这两个sparql查询不同?

为什么这两个sparql查询不同?,sparql,Sparql,如果删除“?主语?谓语?宾语”,则查询结果不同。我理解他们应该是一样的: SELECT ?class (COUNT(?subject) as ?classCount) WHERE { ?subject ?predicate ?object. ?subject rdf:type ?class . } GROUP BY ?class ORDER BY DESC(?classCount) 但它们产生了不同的结果。为什么会这样?为什么你认为它们应该是一样的?将其视为单独评估的每个三

如果删除“?主语?谓语?宾语”,则查询结果不同。我理解他们应该是一样的:

SELECT ?class (COUNT(?subject) as ?classCount) 
WHERE {
    ?subject ?predicate ?object. 
    ?subject rdf:type ?class .
}
GROUP BY ?class
ORDER BY DESC(?classCount)

但它们产生了不同的结果。为什么会这样?

为什么你认为它们应该是一样的?将其视为单独评估的每个三重模式,然后在
?subject
变量上加入。拿一张有一些样本数据的纸,看看会发生什么
SELECT?class(COUNT(DISTINCT?subject)as?classCount)
将避免加入中重复的
?subject
绑定,因此
DISTINCT
操作符是go@AKSW,第一个说“查找所有三元组”&第二个说“查找具有关系rdf:type的所有三元组”,所以这个连接实际上等于第二个连接。然而,事实并非如此。为什么?什么?为什么join等于second?请拿一个小样品和一张纸,用手做。如果您只有
:s rdf:type:C1.:s rdf:类型:C2只有第二个三元组模式得到了2个绑定(又名行),对吗?顺便说一下,这也不是您想要的结果(
DISTINCT
操作符,正如我前面所说的,是正确的方法)。现在,您的第一个三元组模式也匹配两个三元组,对吗?还有两个绑定。然后连接会导致2x2绑定,对吗?4 != 2,明显不同。@AKSW,继续你的例子,如果模型还有两个关系,:s sings:c3,:s sings:c4。然后第一个模式将返回所有4个三元组,第二个模式仅返回带有rdf:type的两个三元组。当它们结合在一起时,结果不是只有第二个两个三元组吗?因为他们没有加入工会,而是加入了。也许我在理解“join”的语义方面有些困难。这里“predicate”指的是任何关系,但“rdf:type”是任何“predicate”的子集。对吗?“当他们加入时,结果不是只有第二个两个三元组吗?”-不,我想你加入了。这和数据库一样。第一个三重模式有4个绑定行。第二个三重模式有两个绑定B2。然后,对于B4中的每个绑定,您将运行B2中的所有绑定。它只不过是一个嵌套循环。4x2=8。
Finding all triples with a 'rdf:type' relationship. no other conditions.