2015-02-10 33 views
5

Najczęściej używam SPARQL SELECT podczas pracy nad zapytaniem do celów debugowania, ale na koniec chcę użyć końcowego wyniku w sposób CONSTRUCT; ponieważ chcę pracować z wykresem, a nie z wynikiem zapytania klucz/wartość.Funkcje SPARQL w CONSTRUCT/WHERE

To, czego jeszcze nie dostaję (i nie mogę znaleźć w wyszukiwarkach/dokumentach), to jeśli mogę korzystać z funkcji w ten sposób. Jako przykład, używam ścieżkę własności do łączenia tytułów I dostać się do „superstrun”, które później wykorzystują do budowania indeksu Lucene zwiększyć zwykły jakości Poszukiwanie

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 . 
    } 
} 

Teraz chciałbym mieć sama ?fancytitle jako nowy potrójny jak

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

Więc mogę przechowywać go bezpośrednio w nowym wykresie. czy to możliwe? Grałem z pewnymi pytaniami, ale nie udało mi się uzyskać akceptacji przez procesor SPARQL. FYI Używam Fuseki.

Można go wypróbować na moim SPARQL Endpoint

Odpowiedz

3

Z pomocą mojego kolegi mamy go do pracy, UNION i GROUP BY są niezbędne. To zapytanie stawia ciąg razem dla wszystkich locah:ArchivalResource na wykresach:

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

Tak to jest możliwe

nie można bezpośrednio używać wyrażeń w CONSTRUCT szablonu lecz można przypisać zmienną w klauzuli WHERE albo poprzez ekspresję SELECT w pod-zapytaniu lub przy użyciu BIND.

W twoim przypadku jako GROUP_CONCAT jest agregatem, może to być tylko wyrażenie SELECT, więc po prostu musisz umieścić całą swoją SELECT jako pod-zapytanie, np.

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 . 
    } 
    } 
} 

Powyższe prace dobrze na swoim końcowym

+0

Chociaż byłem już przy użyciu sub-zapytań w innych sytuacjach, nie myśleć, że dzięki dużo! Jak wyglądałoby "BIND" dla funkcji nieagregatowych? –

+0

Pytanie uzupełniające, czy nadal mogę zastąpić identyfikator URI zasobu zmienną w tym zapytaniu? Jak '? Resource a locah: ArchivalResource; '- Odzyskuję zero wyników w ten sposób. Chciałbym wykonać to na wszystkich ArchivalResource –

+0

Zobacz moją własną odpowiedź na pełne zapytanie, dzięki jeszcze raz Rob! –