2015-02-10 11 views
5

Tôi chủ yếu sử dụng SPARQL SELECT khi làm việc trên truy vấn cho mục đích gỡ lỗi nhưng cuối cùng tôi muốn sử dụng kết quả cuối cùng theo cách CONSTRUCT; vì tôi muốn làm việc với biểu đồ chứ không phải kết quả truy vấn khóa/giá trị.Chức năng SPARQL trong CONSTRUCT/WHERE

Điều tôi chưa nhận được (và dường như không thể tìm thấy với các công cụ tìm kiếm/tài liệu) là nếu tôi có thể sử dụng các chức năng theo cách đó. Như một ví dụ, tôi sử dụng một con đường tài sản để nối danh hiệu tôi nhận được vào một "siêu dây", mà sau này tôi sử dụng để xây dựng một chỉ số Lucene để nâng cao chất lượng tìm kiếm văn bản đơn giản:

PREFIX dc: <http://purl.org/dc/elements/1.1/>  

SELECT (group_concat(?title ; separator = " ") AS ?fancytitle) WHERE { 
    GRAPH ?graph { 
    <http://data.staatsarchiv-bs.ch/id/archivalresource/CH-000027-1/pa-633c-a-312-fasc-163> dc:relation+ ?relation . 
    ?relation dc:title ?title . 
    } 
} 

Bây giờ tôi muốn có giống nhau ?fancytitle là người mới ba như

<http://data.staatsarchiv-bs.ch/id/archivalresource/CH-000027-1/pa-633c-a-312-fasc-163> <fancytitle> ?fancytitle . 

Vì vậy, tôi có thể lưu trữ trực tiếp trong biểu đồ mới. Điều này có thể không? Tôi đã chơi với một số truy vấn nhưng không thể quản lý để nó được bộ xử lý SPARQL chấp nhận. FYI Tôi đang sử dụng Fuseki.

Bạn có thể dùng thử tại tôi SPARQL Endpoint

Trả lời

3

Với sự giúp đỡ của đồng nghiệp của tôi, chúng tôi đã nhận nó để làm việc, UNIONGROUP BY là rất cần thiết. Truy vấn này đặt các chuỗi lại với nhau cho tất cả locah:ArchivalResource trong đồ thị:

CONSTRUCT 
{ 
    ?archresource skos:hiddenLabel ?supertitle 
} 
WHERE 
{ 
    SELECT ?archresource (group_concat(?title ; separator = ", ") AS ?supertitle) WHERE { 
    GRAPH ?graph { 
     { 
     SELECT ?title ?archresource WHERE { 
      GRAPH ?graph { 
      { 
       ?archresource a locah:ArchivalResource ; 
       dc:title ?title . 
      } UNION 
      { 
       ?archresource dc:relation+ ?relation . 
       ?relation dc:title ?title . 
      } 
      } 
     } 
     } 
    } 
    } GROUP BY ?archresource 
} 
9

Có điều này là có thể

Bạn không thể sử dụng các biểu trực tiếp trong một mẫu CONSTRUCT nhưng bạn có thể gán biến trong mệnh đề WHERE hoặc thông qua một biểu SELECT trong truy vấn phụ hoặc sử dụng BIND.

Trong trường hợp của bạn là GROUP_CONCAT là tổng hợp, nó chỉ có thể là biểu thức SELECT do đó bạn chỉ cần đặt toàn bộ SELECT làm truy vấn phụ, ví dụ:

PREFIX dc: <http://purl.org/dc/elements/1.1/>  

CONSTRUCT 
{ 
    <http://data.staatsarchiv-bs.ch/id/archivalresource/CH-000027-1/pa-633c-a-312-fasc-163> <http://fancyTitle> ?fancytitle 
} 
WHERE 
{ 
    SELECT (group_concat(?title ; separator = " ") AS ?fancytitle) WHERE { 
    GRAPH ?graph { 
     <http://data.staatsarchiv-bs.ch/id/archivalresource/CH-000027-1/pa-633c-a-312-fasc-163> dc:relation+ ?relation . 
     ?relation dc:title ?title . 
    } 
    } 
} 

Các công trình trên tốt trên thiết bị đầu cuối của bạn

+0

Trong khi tôi đang đã sử dụng phụ truy vấn trong các tình huống khác, tôi không nghĩ về điều đó, thanks a lot! Làm thế nào một 'BIND' trông giống như các hàm không tổng hợp? –

+0

Câu hỏi tiếp theo, tôi vẫn có thể thay thế URI của tài nguyên bằng một biến trong truy vấn này không? Giống như '? Tài nguyên một locah: ArchivalResource; '- Tôi không nhận được kết quả như thế này. Tôi muốn thực hiện điều này trên tất cả ArchivalResource –

+0

Xem câu trả lời của riêng tôi cho truy vấn đầy đủ, cảm ơn Rob lần nữa! –