2012-03-19 50 views

Trả lời

4

Câu hỏi thú vị, vì nó dường như đủ đơn giản và khó có thể thể hiện chính xác truy vấn. William Greenly's answer không cung cấp những gì bạn muốn, mặc dù ông hoàn toàn đúng trong lời giải thích của mình và sử dụng đúng cách property path. Để có thể hỏi đúng truy vấn phù hợp với câu hỏi của bạn, nó phải được giả định rằng tất cả các danh sách đều được hình thành (chúng chỉ có một phần tử đầu tiên, một phần còn lại và chúng kết thúc bằng một số không).

Sự cố trong truy vấn của bạn là nó sẽ tính tất cả thành viên của tất cả các danh sách trong tập dữ liệu. Bạn cần một cái gì đó để liên kết rdf:first chỉ với phần tử của một danh sách.

Nếu bạn có một URI xác định danh sách của bạn quan tâm, bạn có thể như sau:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX ex: <http://www.example.org/#> 
SELECT (COUNT(?member) AS ?count) 
WHERE { 
    ex:uriOfTheList rdf:rest*/rdf:first ?member 
} 

Nhưng thường, danh sách không được xác định bởi một URI. Trong trường hợp này, có thể xác định danh sách nhất định bằng cách sử dụng các thuộc tính khác. Ví dụ, hãy tưởng tượng bạn có một tài sản ex:listOfAuthors, bạn có thể làm:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX ex: <http://www.example.org/#> 
SELECT (COUNT(?member) AS ?count) 
WHERE { 
    ex:publication ex:listOfAuthors ?list . 
    ?list rdf:rest*/rdf:first ?member . 
} 

Lưu ý rằng nếu bạn chỉ cần làm:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
SELECT (COUNT(?member) AS ?count) 
WHERE { 
    ?list rdf:rest*/rdf:first ?member . 
} 

bạn sẽ thêm lên tất cả các kích thước của danh sách và các danh sách con. Bây giờ mọi thứ trở nên phức tạp nếu bạn không có các vị từ mà bạn có thể đính kèm danh sách và bạn không có URI và có thể bạn muốn tính số lượng cho tất cả các danh sách, cho mỗi danh sách. Có một cách mà nên làm việc:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
SELECT (COUNT(?c) AS ?count) 
WHERE { 
    ?thing !rdf:rest ?list . 
    ?list rdf:rest*/rdf:first ?member . 
} 

Điều này được nói là chúng ta muốn tìm cái gì đó kết nối với một danh sách, nhưng không phải với vị rdf:rest. Về nguyên tắc, chỉ có sự khởi đầu của một danh sách được kết nối thông qua một vị từ cho một thực thể khác, nếu thực thể không phải là một danh sách và vị từ đó không phải là rdf:rest. Hơn nữa, danh sách thường được kết nối bằng cách nào đó với các thực thể khác, vì sẽ không có điểm nào trong việc mô tả danh sách độc lập với bất kỳ thứ gì khác.

+0

Cảm ơn Antoine, bạn đã xác định được một điểm quan trọng trong danh sách được kết nối với một thứ gì đó. Tôi không nghĩ về nó khi tôi thử truy vấn trên một tập dữ liệu với chỉ một danh sách trong đó. – user1278577

3

Đây thực sự là một câu hỏi thực sự tốt vì không phải là một giải pháp đặc biệt đơn giản của nó.

Các điều khoản quan trọng trong danh sách RDF là:

rdf:first 
rdf:rest 
rdf:nil 

cho một danh sách nhiều hơn một mục, nó được khuyến khích mà bạn mô hình như sau:

a:a rdf:first a:b; 
    rdf:rest [ 
     rdf:first a:c; 
     rdf:rest rdf:nil. 
    ]. 

sử dụng rdf: nil để chỉ rằng danh sách không còn có bất kỳ mục nào nữa (vì vậy về bản chất nó là danh sách các danh sách). Tuy nhiên nó cũng nói rằng bạn có thể sử dụng rdf: thứ nhất interderterminantly như sau:

a:a rdf:first a:b; 
    rdf:first a:c; 
    rdf:rest rdf:nil. 

Mấu chốt của rdf: nil là để xác định rằng một danh sách không còn có bất kỳ mặt hàng. Hãy nhớ rằng Web ngữ nghĩa dựa trên các giả định của Open World, vì vậy trừ khi được nêu khác, bạn không thể giả định rằng danh sách không có nhiều mục đơn giản chỉ vì chúng không được biết hoặc được tuyên bố, vì thế cần cho cá nhân, rdf: nil.

May mắn thay, trong ví dụ trên, có một truy vấn cho cả hai, dựa trên bộ xử lý hỗ trợ SPARQL 1.1.

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
SELECT (COUNT(?a) AS ?count) 
WHERE {?a rdf:first+ ?c} 

hãy nhớ rằng trừ khi danh sách chứa rdf: không, đừng cho rằng nó hoàn thành.

+0

cảm ơn William. – user1278577

Các vấn đề liên quan