由于我的英语不好,我无法正式描述我的问题; 让我用一个例子告诉它.下表实际上按"主题","谓词"分组.
我们在行上定义一个集合,如果它们是相同的"主题".现在我想要组合任何两个集合,如果它们包含相同的'谓词',对相同'谓词'的'计数'求和,并计算具有相同集合的不同主题的数量.
subject predicate count
-----------------------------
s1 p1 1
s1 p2 2
s2 p1 3
s3 p1 2
s3 p2 2
Run Code Online (Sandbox Code Playgroud)
因此,从这个表中想要的是两组:
{2, (p1, 3), (p2, 4)},
{1, (p1,3)}
Run Code Online (Sandbox Code Playgroud)
在第一组中,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
Run Code Online (Sandbox Code Playgroud)
然后计数可以解耦,然后总结.它适用于小型数据集,但非常耗时.
我想我会放弃这个奇怪的问题.非常感谢您的回答.
让我们开始吧
select ?predicate (sum(?count) as ?totalcount)
{
?subject ?predicate ?count
}
group by ?predicate
Run Code Online (Sandbox Code Playgroud)
这是基本的一点,但分组不正确(现在澄清).
分组变量应该是这样的(希望这是正确的语法):
select ?subject (group_concat(distinct ?p ; separator = ",") AS ?propset)
{
?subject ?p ?c
}
group by ?subject
Run Code Online (Sandbox Code Playgroud)
我希望这能给出:
subject propset
------------------
s1 "p1,p2"
s2 "p1"
s3 "p1,p2"
Run Code Online (Sandbox Code Playgroud)
所以最后的查询应该是:
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
Run Code Online (Sandbox Code Playgroud)
那样有用吗?