SPARQL计数唯一值组合

时间:2017-08-03 08:35:54

标签: count sparql rdf

我一直在研究SPARQL查询,以便在我的图形商店中查找唯一值组合。但我没有成功。

基本上我尝试做的是:

a b c
e f g
e r t
a b c
k l m
e f g
a b c


result:
a b c | 3
e f g | 2
e r t | 1
k l m | 1

尝试了几种结构,包括区别,分组和子查询,但我没有成功。

上次尝试:

    SELECT  (count (*) as ?n){
      SELECT DISTINCT ?value1 ?value2 ?value3 WHERE {
        ?instance vocab:relate ?value1 .
        ?instance vocab:relate ?value2 .
        ?instance vocab:relate ?value3 .
      }
    }

RDF:

<http://test.example.com/instance1>
        a       <http://test.example.com#Instance> ;
        <http://vocab.example.com/relate>
                <http://test.example.com/c> , <http://test.example.com/b> , <http://test.example.com/a> .

<http://test.example.com/instance6>
        a       <http://test.example.com#Instance> ;
        <http://vocab.example.com/relate>
                <http://test.example.com/g> , <http://test.example.com/f> , <http://test.example.com/e> .

<http://test.example.com/instance4>
        a       <http://test.example.com#Instance> ;
        <http://vocab.example.com/relate>
                <http://test.example.com/c> , <http://test.example.com/b> , <http://test.example.com/a> .

<http://test.example.com/instance2>
        a       <http://test.example.com#Instance> ;
        <http://vocab.example.com/relate>
                <http://test.example.com/g> , <http://test.example.com/f> , <http://test.example.com/e> .

<http://test.example.com/instance7>
        a       <http://test.example.com#Instance> ;
        <http://vocab.example.com/relate>
                <http://test.example.com/c> , <http://test.example.com/b> , <http://test.example.com/a> .

<http://test.example.com/instance5>
        a       <http://test.example.com#Instance> ;
        <http://vocab.example.com/relate>
                <http://test.example.com/m> , <http://test.example.com/l> , <http://test.example.com/k> .

<http://test.example.com/instance3>
        a       <http://test.example.com#Instance> ;
        <http://vocab.example.com/relate>
                <http://test.example.com/t> , <http://test.example.com/r> , <http://test.example.com/e> .

1 个答案:

答案 0 :(得分:4)

AKSW's comment正好点亮:你需要为这些值添加一个排序标准,这样你就不会考虑所有不同的排序方式。另外,请记住RDF没有“重复”三元组,所以

:a :p :c, :c, :d

相同
:a :p :c, :d

所以适当的比较是<而不是<=,因为没有重复的三元组,你永远不会有=个案例。此外,由于值是IRI,因此您需要先获取其字符串值,然后才能与<进行比较,但 str 函数将处理此问题。

prefix v: <http://vocab.example.com/>
prefix : <http://test.example.com/>

select ?a ?b ?c (count(distinct ?i) as ?count) where {
  ?i v:relate ?a, ?b, ?c .
  filter (str(?a) < str(?b) && str(?b) < str(?c))
}
group by ?a ?b ?c
------------------------
| a  | b  | c  | count |
========================
| :a | :b | :c | 3     |
| :e | :f | :g | 2     |
| :e | :r | :t | 1     |
| :k | :l | :m | 1     |
------------------------