2014-12-02 5 views
5

Sto cercando di capire come gestire al meglio i valori letterali nei dati di Marklogic SPARQL che possono essere in ogni caso. Mi piacerebbe essere in grado di fare una ricerca insensibile alle maiuscole e minuscole, ma credo che non sia possibile con le query semantiche. Per un esempio semplicistico che voglio:Come gestire i dati SPARQL senza distinzione tra maiuscole e minuscole in MarkLogic

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

e

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

restituire tutti i valori se l'oggetto è "rosso", "rosso", "rosso" o "rosso".

I miei dati provengono da un'altra fonte che ha regole di capitalizzazione variabile. Al momento l'unica cosa che posso pensare è aggiungere una tripla extra che contenga sempre il testo in minuscolo, così posso sempre cercare su quel valore. In alternativa, avrebbe senso creare una nuova query di intervallo in MarkLogic con una fascicolazione senza distinzione tra maiuscole e minuscole (se ciò è possibile su dati tripli)?

+0

possibile duplicato di [Come scrivere query SPARQL che corrisponda in modo efficiente ai valori letterali stringa ignorando il caso] (http://stackoverflow.com/questions/10660030/how-to-write-sparql-query-that-efficiently-matches- string-literals-while-ignorin) –

risposta

5

È possibile utilizzare un filtro che ignora la custodia.

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

Based on the answer to another question.

Edit: ho chiesto a Steve Buxton, PM di Mark Logic per la semantica caratteristiche, e ha suggerito questo:

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: negozio è un Mark Logic 8 (ora disponibile attraverso Early Access) funzione che seleziona un gruppo di triple. La query SPARQL viene quindi eseguita sul set ridotto, limitando il numero di triple che devono essere filtrate.

+3

Puoi anche usare [cts: contains] (http://docs.marklogic.com/cts:contains). Una query stringa (secondo argomento) è forzata a [cts: word-query] (http://docs.marklogic.com/cts:word-query), che non fa distinzione tra maiuscole e minuscole per le stringhe minuscole. – joemfb

+1

@joemfb buon suggerimento, anche se va sottolineato che quelle sono estensioni specifiche del prodotto che non fanno parte dello standard SPARQL e quindi le query che li utilizzano non saranno trasferibili ad altri negozi SPARQL. –

+0

Più uno in quanto questa è una buona soluzione. Meno uno perché se si basa su un'altra risposta, c'è una buona probabilità che si debba semplicemente contrassegnare la domanda come duplicata. Non c'è niente in discussione con una domanda doppia, ed è meglio avere una risposta canonica piuttosto che molte domande molto simili che vagano intorno. –

Problemi correlati