2012-06-14 55 views
7

Tôi không thể mô tả vấn đề của mình một cách chính thức do tiếng Anh xấu của tôi; hãy để tôi nói nó bằng cách sử dụng một ví dụ. Bảng bên dưới thực sự được nhóm theo 'chủ đề', 'vị ngữ'.Kết hợp nhiều bộ hàng trong SPARQL

Chúng tôi xác định tập hợp trên hàng, nếu chúng có cùng 'chủ đề'. Bây giờ tôi muốn kết hợp bất kỳ hai bộ nào nếu chúng chứa cùng một 'vị ngữ', tính tổng 'số' của cùng một 'vị ngữ' và đếm số đối tượng riêng biệt có cùng một tập hợp.

subject predicate count 
----------------------------- 
s1   p1   1 
s1   p2   2 
s2   p1   3 
s3   p1   2 
s3   p2   2 

Vì vậy, những gì muốn từ bảng này là hai bộ:

{2, (p1, 3), (p2, 4)}, 
{1, (p1,3)} 

nơi trong tập đầu tiên, 2 chỉ có hai đối tượng (s1 và s3) có bộ này; (p1,3) là tổng từ (s1, p1, 1) và (s3, p1, 2).

Vậy làm cách nào tôi có thể truy xuất các bộ này và lưu chúng trong Java?

  • Tôi làm cách nào để sử dụng SPARQL?

  • Hoặc, trước tiên lưu trữ các bộ ba này trong Java, thì làm cách nào tôi có thể nhận các bộ này bằng Java?


Một giải pháp có thể được concat vị từ và đếm,

SELECT (COUNT(?s) AS ?distinct) 
?propset 
(group_concat(?count; separator = \"\\t\") AS ?counts) 
{ 
    SELECT ?s 
    (group_concat(?p; separator = \" \") AS ?propset) 
    (group_concat(?c; separator = \" \") AS ?count 
    { 
     ?s ?p ?c   
    } GROUP BY ?s ORDER BY ?s 
} GROUP BY ?propset ORDER BY ?propset 

Rồi đếm có thể được tách riêng, sau đó tổng hợp. Nó hoạt động tốt trên tập dữ liệu nhỏ, nhưng rất tốn thời gian.

Tôi nghĩ rằng tôi sẽ từ bỏ vấn đề kỳ lạ này. Cảm ơn bạn rất nhiều vì đã trả lời.

Trả lời

9

Hãy bắt đầu với

select ?predicate (sum(?count) as ?totalcount) 
{ 
    ?subject ?predicate ?count 
} 
group by ?predicate 

Đó là chút cơ bản, nhưng nhóm là không đúng (nay là làm rõ).

Biến nhóm nên được như thế này (hy vọng điều này là đúng cú pháp):

select ?subject (group_concat(distinct ?p ; separator = ",") AS ?propset) 
{ 
    ?subject ?p ?c 
} 
group by ?subject 

Tôi hy vọng cung cấp cho:

subject propset 
------------------ 
s1   "p1,p2" 
s2   "p1" 
s3   "p1,p2" 

Vì vậy, các truy vấn cuối cùng nên là:

select ?predicate (sum(?count) as ?totalcount) 
{ 
    ?subject ?predicate ?count . 
    { 
     select ?subject (group_concat(distinct ?p ; separator = ",") AS ?propset) 
     { 
      ?subject ?p ?c 
     } 
     group by ?subject 
    } 
} 
group by ?propset ?predicate 

Điều đó có hiệu quả không?

+0

có ý tôi là 's1 và s3 có cùng một tập hợp'. xin lỗi vì lỗi đánh máy, tôi đã sửa đổi nó (và thay đổi giá trị vị ngữ của s2 để làm cho nó rõ ràng hơn). Tuy nhiên, kết quả tôi muốn là 'tập hợp các bộ'. Hai tập hợp, giả sử {p1, p2} và {p1}, không thể kết hợp vì chúng khác nhau. Vì vậy, chúng tôi sẽ không chỉ tổng hợp giá trị của mọi biến vị ngữ tương tự. Cảm ơn bạn đã trả lời :) – bobharris

+0

Ah, hiểu rồi. Điều đó có thể khó, nhưng tôi đã thêm một lần thứ hai. – user205512

+0

Nó gần như gần với những gì tôi muốn :) nhưng nó vẫn tiếp tục chạy và có vẻ như nó sẽ không đưa ra bất kỳ kết quả nào. Bên cạnh đó, nếu truy vấn này thành công, làm cách nào tôi có thể truy xuất các tập hợp đó tạo thành bảng kết quả?Tôi chỉ có thể thấy bảng kết quả có chứa hai cột, nhưng không cung cấp thông tin về các bộ. Đối với kết quả, chúng sẽ được lưu trữ trong java, vì vậy .. thực tế tôi chỉ muốn những kết quả này. Cám ơn bạn một lần nữa. – bobharris

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