2016-03-22 8 views
1

Ich habe die folgende Abfragemit bind Concat in Konstrukt Abfrage

CONSTRUCT{ 
    ?entity a something; 
    a label ?label . 
} 
WHERE 
{ 
    ?entity a something; 
    a label ?label . 
BIND(CONCAT(STR(?label), " | SOME ADDITIONAL TEXT I WOULD LIKE TO APPEND MANUALLY")) AS ?label) . 
} 

Ich möchte einfach einen Text mit ?label verketten, aber wenn die Abfrage ausgeführt wird ich die folgende Fehlermeldung erhalten:

BIND clause alias '?label' was previously used 

I Ich möchte nur eine einzige Instanz von ?label zurückgeben, daher habe ich es in der Konstruktklausel definiert.

Antwort

4

Die Fehlermeldung scheint genau zu sein, ist aber nur die erste von vielen, die Sie mit dieser Abfrage erhalten. Die übliche Bitte, einige SPARQL-Lernressourcen zu betrachten, um zumindest die Grundlagen des tripelbasierten Graphenmustervergleichs zu verstehen, zusammen mit ein paar Hinweisen, wonach man suchen sollte. Konstrukt ist kein schlechter Ort zu starten, und die folgenden soll fast das tun, was ich denke, Sie beabsichtigen:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
CONSTRUCT{ 
    ?entity rdfs:label ?label . 
} 
WHERE 
{ 
    ?entity a ex:something ; 
     rdfs:label ?oldlabel . 
    BIND(CONCAT(STR(?oldlabel), " | SOME ADDITIONAL TEXT I WOULD LIKE TO APPEND MANUALLY")) AS ?label) . 
} 

ganz Es gibt ein paar Dinge anders über diese Abfrage, so werfen Sie einen Blick zu sehen, ob es genau das tut, was Sie wollen. Ein Hinweis ist der syntaktische Unterschied zwischen der Verwendung von '.' und ';' um die dreifachen Muster zu trennen. Ein anderer Grund ist, dass jede Klausel entweder eine URL definiert, die im Beispiel einen q-Namen verwendet, oder eine Variable, der ein "?" Vorangestellt ist. Weder "Label" noch "etwas" sind gültig.

Ich sage "fast", weil CONSTRUCT nur eine Reihe von Tripel zurückgibt. Um die Etiketten zu ändern, die ich denke, die Absicht ist, müssen Sie SPARQL Update verwenden, d.h .:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX ex: <http://example.org/example#> 
DELETE { 
    ?entity rdfs:label ?oldlabel . 
} 
INSERT{ 
    ?entity rdfs:label ?label . 
} 
WHERE 
{ 
    ?entity a ex:something . 
    ?entity rdfs:label ?oldlabel . 
    BIND(CONCAT(STR(?oldlabel), " | SOME ADDITIONAL TEXT I WOULD LIKE TO APPEND MANUALLY") AS ?label) . 
} 

Beachten Sie, wie die dreifache Muster für die Spiele findet? Oldlabel und löscht sie, die neu gebunden Einfügen? Label statt. Diese Abfrage geht davon aus, dass ein Standarddiagramm definiert ist, das sowohl die Originaldaten als auch das Ziel für Aktualisierungen enthält. Wenn nicht, muss das Diagramm mit WITH oder GRAPH angegeben werden. (Ein weiterer Hinweis auf den syntaktischen Unterschied zwischen der Verwendung von '.' Und ';', um dreifache Muster zu trennen.)