我一直在研究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> .
答案 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 |
------------------------