2016-06-20 4 views
5

コンテンツDBに保存している個々のドキュメントの一部として管理されていないトリプルが保存されています。本質的に各文書は人物を表し、定義された三つ組は人のマネージャーの文書URIを指定する。私は、SPARQLを使用して、マネージャとそれらの下にあるすべての人との間のパスの長さを決定しようとしています。SPARQLクエリを最適化する方法はありますか?

彼らは私が階層内でその下aperson、マネージャを返すために使用することができ、次の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> 

のような文書の外観でトリプル。

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の周りに、でも私は見ています階層ツリーは、1つのまたは2つのレベルの深さの場合には、動作しますが、非常に遅いです。私は63,139このタイプのマネージャトリプルをデータベースに持っています。

+0

'?manager'に対して1つのバインディングしかないので、' ORDER BY?leaf'でなければなりません。 – 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で直接バインドするのは遅いだけです。 –

関連する問題