我有两个问题:
查询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
的频率。
答案 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 /库等,则不确定是否有任何相关/有用的信息,那么我/其他人可能能够提供更好的答案