SPARQL UNION - 结果集不完整

时间:2010-05-04 21:16:38

标签: union rdf sparql jena

我有两个问题:

查询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的某些结果不在联合集中,反之亦然。查询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的频率。

2 个答案:

答案 0 :(得分:2)

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

DISTINCT实际上只是用于删除重复项。这不是分组和计数。

答案 1 :(得分: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 /库等,则不确定是否有任何相关/有用的信息,那么我/其他人可能能够提供更好的答案