2012-05-03 27 views
8

Với mô hình này rất đơn giản:Làm thế nào để làm một COUNT SPARQL

@prefix :  <http://example.org/tags#> . 
@prefix owl:  <http://www.w3.org/2002/07/owl#> . 
@prefix rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . 
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . 
@prefix xsd:  <http://www.w3.org/2001/XMLSchema#> . 

:tag rdf:type rdf:Property . 

:item1 
     rdf:type owl:Thing ; 
     :tag "a"^^xsd:string . 

:item2 
     rdf:type owl:Thing ; 
     :tag "a"^^xsd:string , "b"^^xsd:string . 

:item3 
     rdf:type owl:Thing ; 
     :tag "a"^^xsd:string , "b"^^xsd:string , "c"^^xsd:string . 

tôi đang cố gắng để có được một danh sách các mục và số lượng của các thẻ đó từng có:

item tagCount 
===== ======== 
item1 1 
item2 2 
item3 3 

đây là truy vấn của tôi:

SELECT ?item (count(?tag) as ?tagcount) 
WHERE { 
    ?item :tag ?tag 
} 

Tuy nhiên nó đang trở lại:

item tagCount 
===== ======== 
     6 

Từ những gì tôi đã đọc, thao tác này sẽ hoạt động. Tôi đang sử dụng Jena 2.6.4

+1

'COUNT' không phải là một phần của đặc tả SPARQL 1.0, nó được thêm vào 1.1. Một số triển khai hỗ trợ nó mặc dù vậy. Chỉ cần nói. –

+0

Được bình chọn cho câu hỏi được thể hiện rõ ràng và định dạng phù hợp! – cygri

Trả lời

6

Tôi chưa thử điều này, nhưng hãy thử thêm GROUP BY ?item vào cuối truy vấn. Tôi nghĩ rằng không có GROUP BY nó chỉ đếm tổng số hàng.

+0

Có, nó đếm tổng số hàng. Nó chính xác giống như những gì SQL cũng vậy trong trường hợp này. Tuy nhiên, tôi không biết chuyện gì xảy ra với '? Item'. –

3

Đối với các ràng buộc để xuất hiện trong các kết quả bạn cần phải sử dụng nhóm theo từ khóa để điều này trở thành

CHỌN mục (count (tag) như tagcount?) ĐÂU { mục:? Thẻ? tag } nhóm bằng? mục

Nếu bạn muốn tính cái gì đó ở giữa các truy vấn mà bạn sẽ làm như sau, lưu ý làm thế nào bạn phải đặt chọn truy vấn nội thành khối riêng của mình {}

SELECT * { 
    ?item a owl:Thing . 

    { 
     SELECT ?item (count(?tag) as ?tagcount) 
     WHERE { 
      ?item :tag ?tag 
     } group by ?item 
    } 
} 
0

lựa chọn phụ bởi @ user2316243 là không cần thiết, do đó truy vấn sau là tương đương:

SELECT ?item (count(?tag) as ?tagcount) 
WHERE { 
    ?item a owl:Thing . 
    ?item :tag ?tag . 
} GROUP BY ?item 
Các vấn đề liên quan