2016-06-20 41 views
5

Ho tripli non gestiti memorizzati come parte di singoli documenti che sto memorizzando nel mio contenuto db. Essenzialmente ogni documento rappresenta una persona e la tripla definita specifica l'URI del documento per il manager della persona. Sto cercando di usare SPARQL per determinare la lunghezza dei percorsi tra un manager e tutte le persone sotto di loro nella gerarchia.Esiste un modo per ottimizzare le query SPARQL?

Le triple nel documento sembrano

<sem:triple xmlns:sem="http://marklogic.com/semantics"> 
    <sem:subject>http://rdf.abbvienet.com/infrastructure/person/10740024</sem:subject> 
    <sem:predicate>http://schemas.abbvienet.com/ontologies/infrastructure.owl#manager</sem:predicate> 
    <sem:object>http://rdf.abbvienet.com/infrastructure/person/10206242</sem:object> 
</sem:triple> 

ho trovato la seguente query SPARQL, che può essere utilizzato per restituire un manager, aperson sotto di loro nella gerarchia, e il numero di nodi lontani sono .

select ?manager ?leaf (count(?mid) as ?distance) { 
    BIND(<http://rdf.abbvienet.com/infrastructure/person/10025613> as ?manager) 
    ?leaf <http://schemas.abbvienet.com/ontologies/infrastructure.owl#manager>* ?mid . 
    ?mid <http://schemas.abbvienet.com/ontologies/infrastructure.owl#manager>+ ?manager . 
} 
group by ?manager ?leaf 
order by ?manager ?leaf 

Questo funziona, ma è molto lento, anche nel caso in cui la struttura gerarchica che sto guardando è uno o due livelli di profondità, intorno 15s. Ho 63,139 gestori tripli di questo tipo nel db.

+0

Non dovrebbe essere 'ORDER BY? Leaf' come si ha una sola associazione per'? Manager'. – scotthenninger

risposta

6

Penso che il problema più grande sarà il BIND() - MarkLogic 8 non ottimizza il pattern che stai utilizzando bene. Puoi provare a sostituire la tua costante nei luoghi in cui usi la variabile ?manager per vedere se questo fa una grande differenza? cioè .:

select ?leaf (count(?mid) as ?distance) { 
    ?leaf <http://schemas.abbvienet.com/ontologies/infrastructure.owl#manager>* ?mid . 
    ?mid <http://schemas.abbvienet.com/ontologies/infrastructure.owl#manager>+ 
    <http://rdf.abbvienet.com/infrastructure/person/10025613> . 
} 
group by ?leaf 
order by ?leaf 

StackOverflow non è un luogo ideale per rispondere alle domande di prestazioni di questo tipo, dato che è davvero bisogno di una conversazione in cui lavoriamo insieme per aiutarvi. Forse puoi provare a contattare support o lo MarkLogic developer mailing list per questo tipo di domande?

+0

Senza il binding, ha un'esecuzione molto veloce. Grazie. –

+0

Solo un altro commento. È anche veloce se imposto i parametri di bind nella chiamata 'sem: sparql'. È lento quando leggo direttamente in SPARQL. –