在SPARQL中组合多组行

时间:2012-06-14 04:44:39

标签: java sparql jena

由于我的英语不好,我无法正式描述我的问题;让我用一个例子告诉它。 下表实际上按“主题”,“谓词”分组。

我们在行上定义一个集合,如果它们是相同的“主题”。现在我想要将任何两个集合组合,如果它们包含相同的'谓词',对相同'谓词'的'计数'求和,并计算具有相同集合的不同主题的数量。

subject    predicate    count
-----------------------------
s1           p1           1
s1           p2           2
s2           p1           3
s3           p1           2
s3           p2           2

因此,从这张表中想要的是两组:

{2, (p1, 3), (p2, 4)}, 
{1, (p1,3)} 

其中在第一组中,2表示有两个科目(s1和s3)具有此组; (p1,3)是(s1,p1,1)和(s3,p1,2)之和。

那么如何检索这些集并将它们存储在Java中呢?

  • 如何使用SPARQL进行此操作?

  • 或者,首先将这些三元组存储在Java中,然后如何使用Java获取这些集合?


一种解决方案可能是concat谓词和计数,

SELECT (COUNT(?s) AS ?distinct)
?propset
(group_concat(?count; separator = \"\\t\") AS ?counts)
{
    SELECT ?s 
    (group_concat(?p; separator = \" \") AS ?propset)
    (group_concat(?c; separator = \" \") AS ?count
    {
        ?s ?p ?c        
    } GROUP BY ?s ORDER BY ?s
} GROUP BY ?propset ORDER BY ?propset

然后计数可以解耦,然后总结。 它适用于小型数据集,但非常耗时。

我想我会放弃这个奇怪的问题。 非常感谢您的回答。

1 个答案:

答案 0 :(得分:9)

让我们从

开始
select ?predicate (sum(?count) as ?totalcount) 
{
    ?subject ?predicate ?count
}
group by ?predicate

这是基本的一点,但分组不正确(现已澄清)。

分组变量应该是这样的(希望这是正确的语法):

select ?subject (group_concat(distinct ?p ; separator = ",") AS ?propset)
{
    ?subject ?p ?c
}
group by ?subject

我希望能给出:

subject    propset
------------------
s1          "p1,p2" 
s2          "p1"  
s3          "p1,p2"  

所以最终的查询应该是:

select ?predicate (sum(?count) as ?totalcount) 
{
    ?subject ?predicate ?count .
    {
        select ?subject (group_concat(distinct ?p ; separator = ",") AS ?propset)
        {
            ?subject ?p ?c
        }
        group by ?subject
    }
}
group by ?propset ?predicate

这有用吗?