2016-05-14 14 views
0

Meine Ontologie hat 2 Klassen. Klasse food und Klasse foodSource. Ich möchte Daten Essen mit 2 Art von foodSource erhalten mitSPARQL Filter Regex und Union

SELECT ?food ?foodSource ?foodSource2 
WHERE { 
    { 
    ?foodSource mpasi:data_memerlukanBahan ?memerlukanBahan. 
    ?food ?memerlukanBahan ?value. 
    FILTER regex(str(?foodSource),"carrot") 
    } 
    UNION 
    { 
    ?foodSource2 mpasi:data_memerlukanBahan ?memerlukanBahan. 
    ?food ?memerlukanBahan ?value. 
    FILTER regex(str(?foodSource2),"tomato") 
    } 
} 
order by ?food 

ich das Ergebnis richtig zu bekommen. Aber dann möchte ich eine Nahrungsquelle vermeiden. Also, wie kann ich Essen ohne irgendeine Nahrungsquelle bekommen? Zum Beispiel habe ich 3 Arten von Essen: - Kedelai Brei - Apfelkuchen - Tomatensuppe Dann möchte ich Essen ohne Apfel drin. So, natürlich bekomme ich nur Kedelai Brei und Tomatensuppe. Kann ich es mit Regex bekommen?

FILTER (!regex(str(?foodSource),"apple")). 
+1

Regex unterstützt Vereinigung und Negation, die ist wahrscheinlich effizienter als das Schreiben über SPARQL union und MINUS. – AKSW

Antwort

1

Vielleicht ist ein erster Schritt Refactor Ihre UNION Anweisung. Die ersten beiden Tripelmuster sind für beide UNION Grafikanweisungen dieselben, also verschieben Sie diese außerhalb Ihrer UNION Anweisung. Dann sind Sie mit nur den beiden FILTER Aussagen verlassen, die neu geschrieben werden kann, mit einem || Ausdruck:

Vielleicht besser, als @AKSW schon sagt, ist die or in der Regex auszuführen selbst:

Da FILTER in SPARQL ist ein positiver Filter - es gibt an was zu durchlassen - dann "Karotte" und "Apfel" sind die einzigen möglichen Lösungen. "Kartoffel" kann nicht durch den Filter gelangen.

Allerdings, wenn Sie alles finden, wollte aber "Kartoffel", dann haben Sie ein paar Negation Auswahl:

FILTER (!regex(str(?foodSource),"potato")) 

oder über regex Negation:

FILTER regex(str(?foodSource),"[^potato]") 
+0

'" [^ potato "]' hat einige unsymmetrische Klammern/Anführungszeichen. Aber trotzdem denke ich, dass das nicht das macht, was du willst; Ich denke, dass "[^ potato]" nur mit einem einzelnen Zeichen übereinstimmt, das nicht p, o, t oder a ist. –

+0

Der Tippfehler wurde korrigiert. Die Regex ist korrekt. Innerhalb einer Zeichenklasse negiert '^' die Zeichenkette. – scotthenninger

+0

Ich weiß negiert, aber '[abc]' entspricht einem Zeichen aus einem b und c; stimmt '[^ abc]' nicht mit einem Zeichen überein, das kein b oder c ist? –