2014-12-02 8 views
5

Ich versuche zu verstehen, wie man am besten in Marklogic SPARQL-Daten, die in jedem Fall sein können, zu behandeln. Ich würde gerne in der Lage sein, eine Suche ohne Berücksichtigung der Groß- und Kleinschreibung durchzuführen, aber ich glaube, das ist bei semantischen Abfragen nicht möglich. Für ein einfaches Beispiel mag ich:Wie man mit SPARQL-Daten in MarkLogic nicht umgehen kann

SELECT * 
WHERE { ?s ?p "Red"} 

und

SELECT * 
WHERE { ?s ?p "red"} 

alle Werte zurück, ob das Objekt "Rot", "RED", "rot" oder "rot".

Meine Daten stammen aus einer anderen Quelle, die variable Großschreibung hat. Im Moment ist das einzige, was ich mir vorstellen kann, ein zusätzliches Tripel hinzuzufügen, das immer den Text in Kleinbuchstaben enthält, damit ich immer nach diesem Wert suchen kann. Oder wäre es sinnvoll, eine neue Bereichsabfrage in MarkLogic mit einer Groß-/Kleinschreibung ohne Berücksichtigung der Groß-/Kleinschreibung zu erstellen (wenn das bei Dreifachdaten möglich ist)?

+0

mögliche Duplikate von [Wie schreibe ich SPARQL-Abfrage, die String-Literale effizient beim Ignorieren von Groß- und Kleinschreibung berücksichtigt] (http://stackoverflow.com/questions/10660030/how-to-write-sparql-query-that-efficiently-matches- string-literals-while-ignorin) –

Antwort

5

Sie könnten einen Filter verwenden, der Groß- und Kleinschreibung ignoriert.

select * where { 
    ?s ?p ?o 
    FILTER (lcase(str(?o)) = "red") 
} 

Based on the answer to another question.

Edit: Ich fragte Steve Buxton, Marklogic die Uhr für Semantik Funktionen und er schlug vor, diese:

let $store := sem:store((), cts:element-value-query(xs:QName("sem:object"), "red", "case-insensitive")) 
return 
    sem:sparql(' 
    SELECT ?o 
    WHERE { 
     ?s ?p ?o 
     FILTER (lcase(str(?o)) = "red") 
    }',(),(), $store 
) 

sem: store ist ein Marklogic 8 (jetzt über Early Access) Funktion, die eine Gruppe von Tripel auswählt. Die SPARQL-Abfrage wird dann auf der reduzierten Menge ausgeführt, wodurch die Anzahl der Tripel begrenzt wird, die gefiltert werden müssen.

+3

Sie können auch [cts: contains] (http://docs.marklogic.com/cts:contains) verwenden. Eine String-Abfrage (zweites Argument) wird zu einer [cts: word-query] (http://docs.marklogic.com/cts:word-query) gezwungen, die für Kleinbuchstaben die Groß-/Kleinschreibung nicht berücksichtigt. – joemfb

+1

@joemfb guter Vorschlag, obwohl darauf hingewiesen werden sollte, dass dies produktspezifische Erweiterungen sind, die nicht Teil des SPARQL-Standards sind, und daher Abfragen, die sie verwenden, nicht in andere SPARQL-Speicher portierbar sind. –

+0

Plus eins, da dies eine gute Lösung ist. Minus eins, denn wenn es auf einer anderen Antwort basiert, gibt es eine gute Chance, dass Sie die Frage einfach als Duplikat kennzeichnen. Es gibt nichts mit einer doppelten Frage, und es ist besser, eine kanonische Antwort zu haben, als dass viele sehr ähnliche Fragen herumlaufen. –