1

我有两个疑问:

查询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

4

2 回答 2

2

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

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

于 2010-06-06T20:34:35.930 回答
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/库等中执行查询的环境的更多详细信息,那么我/其他人可能能够提供更好的回答

于 2010-05-05T13:04:49.490 回答