2016-06-20 3 views
5

У меня есть неуправляемые тройки, хранящиеся как часть отдельных документов, которые я храню в своем содержании db. По сути, каждый документ представляет собой человека, а определенная тройка указывает URI документа для менеджера человека. Я пытаюсь использовать SPARQL для определения длины путей между менеджером и всеми людьми под ними в иерархии.Есть ли способ оптимизировать запросы SPARQL?

Тройки в документе выглядит

<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> 

Я нашел следующий SPARQL запрос, который может быть использован для возврата менеджера, aperson под ними в иерархии, а число узлов удаленных они ,

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 

Это работает, но очень медленно, даже в том случае, когда иерархия дерева Я смотрю на это один или два уровня глубины, вокруг 15s. У меня есть 63,139 менеджер тройки этого типа в дБ.

+0

Не должно быть 'ORDER BY? Leaf', поскольку у вас есть только одна привязка для'? Manager'. – scotthenninger

ответ

6

Я думаю, что самой большой проблемой будет BIND() - MarkLogic 8 не оптимизирует шаблон, который вы используете вообще хорошо. Можете ли вы попытаться заменить свою константу на места, в которых вы используете переменную ?manager, чтобы узнать, имеет ли это значение большое значение? т.е .:

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 не является отличным местом, чтобы ответить на вопросы производительности, как это, так как это действительно нуждается в разговор, где мы работаем вместе, чтобы помочь вам. Может быть, вы можете связаться с support или MarkLogic developer mailing list по этому вопросу?

+0

Без привязки на месте он имеет очень быстрое выполнение. Благодарю. –

+0

Еще один комментарий. Это также быстро, если я устанавливаю параметры привязки в вызове 'sem: sparql'. Это происходит только медленно, когда я напрямую связываюсь с SPARQL. –

Смежные вопросы