2015-02-10 16 views
5

Ich benutze SPARQL SELECT meistens bei der Arbeit an einer Abfrage zu Debugging-Zwecken, aber am Ende möchte ich das Endergebnis in einer CONSTRUCT-Art verwenden; Ich möchte mit einem Graphen und nicht mit Schlüssel/Wert-Abfrageergebnissen arbeiten.SPARQL-Funktionen in CONSTRUCT/WHERE

Was ich noch nicht bekomme (und scheint nicht mit Suchmaschinen/docs zu finden) ist, wenn ich Funktionen so auch verwenden kann. Als Beispiel verwende ich eine Eigenschaft Pfad Titel, die ich in einen „Superstring“ erhalten verketten, die ich später für den Bau eines Lucene Index Klartext Suchqualität zu erhöhen verwenden:

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

Nun möchte Ich mag die haben gleich ?fancytitle als neue triple wie

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

so kann es es direkt in einem neuen Diagramm speichern. Ist das möglich? Ich habe mit einigen Abfragen gespielt, konnte aber nicht vom SPARQL-Prozessor akzeptiert werden. FYI Ich benutze Fuseki.

Sie können es versuchen, an meinem SPARQL Endpoint

Antwort

3

Mit Hilfe meines Kollegen wir es Arbeit bekamen, UNION und GROUP BY wesentlich sind. Diese Abfrage setzt die Zeichenkette zusammen für alle locah:ArchivalResource in den Diagrammen:

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

Ja, das ist möglich

Sie können Ausdrücke nicht direkt in einer CONSTRUCT Vorlage verwenden, aber Sie können die Variable in der WHERE Klausel entweder über einen SELECT Ausdruck zuweisen in einer Unterabfrage oder mit BIND.

In Ihrem Fall als GROUP_CONCAT ist ein Aggregat kann es nur ein SELECT Ausdruck sein, so dass Sie nur Ihre gesamte SELECT als Unterabfrage z.

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

Die oben genannten Arbeiten auf dem Endpunkt feine

+0

Während ich bereits Unterabfragen in anderen Situationen verwendet wurde, habe ich nicht daran denken, vielen Dank! Wie würde ein 'BIND' für nicht aggregierte Funktionen aussehen? –

+0

Folgefrage, kann ich den URI der Ressource noch durch eine Variable in dieser Abfrage ersetzen? Wie '? Ressource eine locah: ArchivalResource; '- Ich bekomme so null Ergebnisse zurück. Ich möchte dies auf allen ArchivalResource –

+0

ausführen Siehe meine eigene Antwort für die komplette Abfrage, danke nochmal Rob! –