2013-02-26 36 views
6

Tôi đang cố gắng tạo biểu đồ RDF từ một cửa hàng RDF Mulgara, sử dụng truy vấn Sparql để trả về kết quả. Tôi chỉ mới bắt đầu cảm thấy thoải mái với các truy vấn đơn giản, hỏi một cách hiệu quả, "đối tượng nào là Thành viên của một bộ sưu tập cụ thể?"Truy vấn đệ quy trong SPARQL để duyệt bộ sưu tập các bộ sưu tập

Câu hỏi của tôi là, và tôi sẽ đánh giá cao bất kỳ lời khuyên nào, cho dù tôi có thể lấy kết quả từ truy vấn đơn giản này và định tuyến lại chúng như đối tượng của truy vấn?

Ví dụ, tôi có truy vấn này SPARQL:

SELECT ?x WHERE {?x <fedora-rels-ext:isMemberOfCollection> <info:fedora/collection:ramsey>} 

Với những kết quả này:

"x" 
info:fedora/ramsey:ThelifeandadventuresofRobinsonCrusoe 
info:fedora/ramsey:Jackanapes 
info:fedora/ramsey:SundayJournalvol01no0219951126 
info:fedora/ramsey:Ideologyandchange 
info:fedora/ramsey:theshepherdofthepyrenees 
info:fedora/ramsey:ScenesinAmerica 
... 

Mục tiêu của tôi, là để sau đó đi những định danh duy nhất và thay thế các đối tượng, <info:fedora/collection:ramsey>, từ truy vấn ban đầu và chạy lại truy vấn.

Tôi đang tưởng tượng một kịch bản mà tôi sẽ xác định một phần tử gốc trong truy vấn ban đầu, đã kết quả trả lại tất cả đối tượng thành viên, sau đó trả lại tất cả đối tượng thành viên những đối tượng, quảng cáo vô cùng tận ...

Điều này có thể thực hiện với các truy vấn Sparql không? Cụ thể, tôi tin rằng tôi đang truy vấn cơ sở dữ liệu RDF Mulgara. Bất kỳ suy nghĩ nào, ngay cả khi 'không thể làm được, được đánh giá rất cao.

+0

@ghkill Tôi đã chỉnh sửa tiêu đề để cung cấp tóm tắt tốt hơn về nội dung này. –

Trả lời

8

Giả sử bạn phải tuân thủ SPARQL 1.0. Tôi tin rằng mulgara đã hỗ trợ giới hạn cho SPARQL 1.1 nếu có.

Với SPARQL 1.0 nếu bạn có thể biết có bao nhiêu mức độ bạn muốn truy vấn, bạn có thể làm những việc như:

SELECT ?y WHERE { 
     ?x <fedora-rels-ext:isMemberOfCollection> <info:fedora/collection:ramsey> 
     ?y <fedora-rels-ext:isMemberOfCollection> ?x 
} 

Đây ?y sẽ bị ràng buộc với các yếu tố cấp 2 từ gốc của bạn. Với UNIONS, bạn có thể truy vấn nhiều cấp với một truy vấn. Một ví dụ cho một và hai cấp độ từ gốc trong một truy vấn:

SELECT ?x WHERE { 
    { 
     ?x <fedora-rels-ext:isMemberOfCollection> <info:fedora/collection:ramsey> . 
    } UNION { 
     ?zz <fedora-rels-ext:isMemberOfCollection> <info:fedora/collection:ramsey> 
     ?x <fedora-rels-ext:isMemberOfCollection> ?zz . 
    } 
} 

Vấn đề ở đây là bạn không thực sự biết ở mức độ ?x là ràng buộc. Do đó bạn không thể vẽ một cây với kiểu truy vấn này. Trong SPARQL 1.1 này được giải quyết với BIND AS

SELECT ?x ?level WHERE { 
    { 
     ?x <fedora-rels-ext:isMemberOfCollection> <info:fedora/collection:ramsey> . 
     BIND (1 AS ?level) 
    } UNION { 
     ?zz <fedora-rels-ext:isMemberOfCollection> <info:fedora/collection:ramsey> 
     ?x <fedora-rels-ext:isMemberOfCollection> ?zz . 
     BIND (2 AS ?level) 
    } 
} 

truy vấn thứ hai này sẽ trở lại ở mức độ ?x là ràng buộc. Bạn có thể tưởng tượng một số truy vấn được tạo lập trình với rất nhiều công đoàn đang cố gắng đạt tới độ sâu tối đa của cây. Nếu bạn muốn hỗ trợ đầy đủ cho SPARQL 1.1 nếu bạn có thể thử sử dụng Jena/ARQ. Trong Jena bạn cũng có thể sử dụng Property paths và với một cái gì đó như sau:

SELECT ?x WHERE { 
    ?x <fedora-rels-ext:isMemberOfCollection>+ <info:fedora/collection:ramsey> . 
} 

Bạn sẽ ràng buộc trong ?x tất cả các nút truy cập từ <info:fedora/collection:ramsey> qua vị <fedora-rels-ext:isMemberOfCollection>.

+1

Bạn thưa bạn, là một học giả và quý ông, cảm ơn bạn rất nhiều. Đây chỉ là những gì tôi đã hy vọng để tìm hiểu, và mang lại cho tôi nhiều thức ăn di chuyển về phía trước. – ghukill