2014-12-10 2 views
2

MarkLogic의 다른 그래프 (컬렉션)에서 비슷한 트리플을 격리해야합니다. 이 작업을 위해 내가 트리플가에서 검색 할 그래프를 지정해야하고, 내 방법은 이것이다 :MarkLogic7의 특정 그래프에서 트리플 선택

cts:triples(
(), 
    sem:iri("http://something/predicate#somepredicate"), "SomeObject",(),(), 
    cts:collection-query("someCollection")) 

이 작동하지만 가난 때문에 수집 쿼리의 수행합니다. 주어진 그래프의 결과로만 결과를 제한하는 더 좋은 방법이 있습니까?

+0

MarkLogic의 정식 버전 번호는 무엇입니까? – mblakele

+0

"성능이 저조한"것은 무엇을 의미합니까? 몇 가지 숫자를 들어 봅시다. 얼마나 많은 트리플이 데이터베이스에 있습니까? 얼마나 많은 주제가 일치합니까? 얼마나 많은 객체와 일치합니까? 컬렉션과 일치하는 항목은 몇 개입니까? 샘플 쿼리는 어느 정도 걸립니까? – mblakele

답변

2

내 노트북에 7.0-4를 사용하여 테스트 케이스를 만들려고했습니다. 그것은 내게는 꽤 빠른 것처럼 보입니다.보세요. 당신이하고있는 것과는 다른 곳을보십시오. 내 생각에 귀하의 쿼리는 많은 트리플을 반환하며 병목 현상이 발생합니다. 일치하는 트리플은 매우 빠르지 만 많은 수를 돌려주는 것은 비교적 느릴 수 있습니다.

먼저 taskbot을 사용하여 몇 가지 트리플을 생성합시다.

(: insert test documents with taskbot :) 
import module namespace tb="ns://blakeley.com/taskbot" 
    at "src/taskbot.xqm" ; 
import module namespace sem="http://marklogic.com/semantics" 
    at "MarkLogic/semantics.xqy"; 

tb:list-segment-process(
    (: Total size of the job. :) 
    1 to 1000 * 1000, 
    (: Size of each segment of work. :) 
    500, 
    (: Label. :) 
    "test/triples", 
    (: This anonymous function will be called for each segment. :) 
    function($list as item()+, $opts as map:map?) { 
    (: Any chainsaw should have a safety. Check it here. :) 
    tb:maybe-fatal(), 
    let $triples := $list ! sem:triple(
     sem:iri("subject"||xdmp:random()), 
     sem:iri("predicate"||xdmp:random(19)), 
     "object"||xdmp:random(49), 
     sem:iri('graph'||xdmp:random(9))) 
    return sem:rdf-insert($triples) 
    , 
    (: This is an update, so be sure to commit each segment. :) 
    xdmp:commit() }, 
    (: options - not used in this example. :) 
    map:new(map:entry('testing', '123...')), 
    (: This is an update, so be sure to say so. :) 
    $tb:OPTIONS-UPDATE) 

이제는 taskbot이 작업 서버에서 대부분의 작업을 수행합니다. 따라서 ErrorLog.txt을 모니터링하거나 CPU가 다운 될 때까지 기다렸다가 트리플 카운트가 1M을 기다리십시오.

count(cts:triples()), 
count(cts:triples((), sem:iri("predicate0"))), 
count(cts:triples((),(), "object0")), 
count(
    cts:triples((),(),(),(),(), cts:collection-query("graph0"))) 
=> 
1000000 
49977 
19809 
100263 

당신은 술어, 객체, 및 수집에 대해 다른 수를 얻을 수 있습니다 : 그 후, 이제 우리가로드 된 것을 볼 수 있도록 데이터가 무작위로 생성 된 것을 기억한다. 그러나 쿼리를 사용해 봅시다.

count(
    cts:triples(
    (), sem:iri("predicate0"), "object0", 
    (),(), cts:collection-query("graph0"))) 
, xdmp:elapsed-time() 

결과 :

100 
PT0.004991S 

나에게 꽤 빨리 보인다 : 5-MS. 데이터가 무작위로 생성 되었기 때문에 다른 수를 얻을 수도 있지만 가까운 수이어야합니다.

큰 결과 집합을 사용하면 속도가 느려집니다. 예를 들어,

count(
    cts:triples(
    (),(),(), 
    (),(), cts:collection-query("graph0"))) 
, xdmp:elapsed-time() 
=> 
100263 
PT0.371252S 

count(cts:triples()) 
, xdmp:elapsed-time() 
=> 
1000000 
PT2.906235S 

count(cts:triples()[1 to 1000]) 
, xdmp:elapsed-time() 
=> 
1000 
PT0.002707S 

볼 수 있듯이 응답 시간은 대략 O (n)이며 세 배수입니다. 사실 그것은 O (n)보다 조금 나아졌지만, 그 야구장에서. 어쨌든 cts:collection-query은 문제가 아닙니다.

+0

철저한 테스트를 위해 시간을내어 주셔서 감사합니다! 당신 말이 맞아요, 결국 콜렉션 쿼리가 아니었지만, 트리플의 볼륨이 반환되었습니다. –

0

컬렉션 쿼리가 성능이 좋지 않은 부분이라면 놀랄 것입니다. 많은 결과가 단순한 복귀로 인해 오도되지 않아 느리게 보일 수 있습니다. 카운트 또는 xdmp : 추정치에 제외시킬 항목을 넣으십시오. CTS에서 별도로

: 트리플, 나는 단지 SEM 생각할 수 : 문이나 그래프와 SPARQL ..

HTH!