2010-05-04 25 views
1

我有两个疑问:SPARQL UNION - 结果集不完整

查询1:

SELECT DISTINCT ?o COUNT(?o) 
WHERE 
{ ?s1 ?somep1 <predicate_one-uri>. ?s1 ?p ?o} 

查询2:

SELECT DISTINCT ?o COUNT(?o) 
WHERE 
{?s2 ?somep2 <predicate_two-uri>.?s2 ?p ?o.} 

每个查询都带给我不同的结果集(如预期) 。我需要让这两组的联合,从我的理解下面的查询应该给我一套我想:

SELECT DISTINCT ?o COUNT(?o) 
WHERE 
{ 
{ ?s1 ?somep1 <predicate_one-uri>.?s1 ?p1 ?o} 
    UNION 
{?s2 ?somep2 <predicate_two-uri>.?s2 ?p2 ?o.} 
} 

的问题是,从查询1一些成果没有在工会组和副-versa查询2.联合工作不正常,因为它没有包含查询1和查询2的所有结果。请告知正确的sparql查询结构以实现所需的结果集。

但如果我提出以下查询(只是删除COUNT函数):

SELECT DISTINCT ?o 
WHERE 
{ 
{ ?s1 ?somep1 <predicate_one-uri>.?s1 ?p ?o} 
UNION {?s2 ?somep2 <predicate_two-uri>.?s2 ?p ?o.} 
} 

我得到相应的结果集。但我也需要有变量?o的频率。

回答

1

不完全在这里肯定,但有一个理论,这可能是完全错误的

您所查询的混淆我咯,因为它似乎在暗示一些分组,因为在理论上至少一个SPARQL引擎应该不会让你同时选择一个变量,没有显式GROUP BY的同一查询中该变量的聚合。所以结果可能取决于您使用的SPARQL引擎/三重存储?

如果隐式分组是这种情况,您可能得不到像您期望的那么多的结果,因为分组会将来自联合两端的结果组合在一起。例如,假设查询1为您提供了10个结果,查询2为您提供了5个结果,那么您可以从一个联合中获得的结果的最大数量是15,但可能会少一些,因为该分组可能会将联合两边的结果组合在一起。为了避免这种情况,那么你应该对查询的两侧使用完全不同的变量名,例如:

SELECT * WHERE { {?s ?p ?o} UNION {?x ?y ?z}} 

这会给你一个结果表,有一个像下面这样的模式:

?s | ?p | ?o | ?x | ?y | ?z 
----------------------------- 
    a | b | c | | | 
    | | | a | b | c 

不知道是否有任何与您相关/有用的,如果您可以提供关于您正在执行查询的环境的更多细节,例如Triplestore,SPARQL引擎,API /库等,那么我/其他人可能能够提供更好的回答

+0

感谢您的反馈。我使用OpenVirtuoso,我相信它使用Jena,允许我使用COUNT聚合函数。我在这里得到了一个参考:http://stackoverflow.com/questions/1223472/sparql-query-and-distinct-count。 据我所知,联合返回的行数可能小于两个查询的总和,因为联合。我的问题是,有些值甚至不会显示在查询1中存在的联合查询中。 对不起,我还是SPARQL和RDF的新手,我相信三重商店是RDF/XML(这是否有意义?)。 再次感谢, JPL – levacjeep 2010-05-05 14:59:41

2

我认为它会工作如果您删除DISTINCT,并将GROUP BY ?o添加到查询的末尾。

DISTINCT真的只是为了删除重复。这不是分组和计数。