2017-04-18 4 views
0

Ich habe zwei Graphen, in einem sind die Literale (@de) in den anderen unmarkiert markiert. Ich brauche eine Verbindung zwischen den beiden. Die triviale Lösung mit einem Filter läuft sehr langsam.Suche nach Literal mit anderen Sprachcode

Eine verbesserte Version, die mit Fuseki funktioniert, ist

WHERE { 
?tok nlp:lemma ?lem . 
Bind (str(?lem) as ?lems) . 
?lu :orthForm ?lems . 
... 

Ich versuchte ?lu :xx (str(?lem)) . aber dies wird als Fehler markiert. Warum? In ähnlicher Weise, mit value ?lems {str(?lem)}.

Ich gehe naiv davon aus, dass die Bindung nicht viel Overhead verursacht, also die obige Lösung wahrscheinlich o.k.

Würde der gleiche Ansatz Arbeit für die Suche, wenn die Sprachcodes unterschiedlich sind my previous question

+0

Ich bekomme das erste Beispiel nicht. Der FILTER sieht komisch aus oder willst du wirklich, dass Subjekt und Objekt gleich sind? – AKSW

Antwort

1

Das einzige in einem dreifachen Muster erlaubt Sache sind Variablen, URIs, Literale (in Objekt) und bnodes. Daher müssen Sie anstelle des Musters ?lu :xx (str(?lem)) ein BIND oder eine Projektion verwenden, um die Variable in eine Zeichenfolge zu konvertieren. Unter dem ersten Beispiel:

WHERE { 
    ?lu :xx ?langLem . 
    BIND(str(?langLem) AS ?lem) 
} 

Oder Projektion:

SELECT (str(?langLem) AS ?lem) 
WHERE { 
    ?lu :xx ?langLem . 
} 

Ich nehme an, Sie versuchen, die VALUES Anweisung in value ?lems {str(?lem)} zu verwenden. VALUES wird in der Regel zu binden Variablen auf einen Satz von Werten verwendet, z.B .:

VALUES ?lem { :Euclid :Gauss } 
?lem rdfs:label ?label . 

... bindet ?lem-:Euclid und :Gauss und führt die Abfrage aus, die Vereinigung der Ergebnisse zurück. I.e. Es ist das gleiche wie:

{ :Euclid rdfs:label ?label } 
UNION 
{ :Gauss rdfs:label ?label }