SPARQL: медленная обработка результата подзапроса - PullRequest
1 голос
/ 26 сентября 2019

Я сейчас изучаю SPARQL и не могу понять, почему то, что мне кажется очень простым запросом, отнимает много времени.Я пытаюсь подсчитать количество статей на автора в журнале, используя проект OpenCitations (конечная точка SPARQL https://opencitations.net/sparql, Я также скачал дамп более ранней версии).

PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX pro: <http://purl.org/spar/pro/>
PREFIX frbr: <http://purl.org/vocab/frbr/core#>
PREFIX fabio: <http://purl.org/spar/fabio/>

SELECT $author (COUNT($author) as $cnt) WHERE {
    # narrowing down journal down to articles (over issues and volumes)
    $jnl a fabio:Journal;
       dcterms:title "Nature" . 
    $volm frbr:partOf $jnl . 
    $issue frbr:partOf $volm .
    $artcl frbr:partOf $issue . 

    # selecting author
    ?artcl pro:isDocumentContextFor ?artcl_atrbts . 
    ?artcl_atrbts pro:isHeldBy ?author.

    # making sure that author is a person
    $author foaf:familyName $y .
}

GROUP BY $author
ORDER BY DESC($cnt)
LIMIT 10

Это работает, как ожидается, и занимает около 3 секунд на дампе, и, возможно, 5 на конечной точке OpenCitations.

Однако теперь я также хочу получить фактические имена авторов, поэтому моя идея заключалась в том, чтобы использовать предыдущий запрос в качестве подзапроса:

PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX pro: <http://purl.org/spar/pro/>
PREFIX frbr: <http://purl.org/vocab/frbr/core#>
PREFIX fabio: <http://purl.org/spar/fabio/>


SELECT $author $last_name $cnt WHERE {
    $author foaf:familyName $last_name. 

    {
    SELECT $author (COUNT($author) as $cnt) WHERE {

    $jnl a fabio:Journal;
    dcterms:title "Nature" . 
    $volm frbr:partOf $jnl . 
    $issue frbr:partOf $volm .

    $artcl frbr:partOf $issue . 
    ?artcl pro:isDocumentContextFor ?artcl_trbts . 
    ?artcl_trbts pro:isHeldBy ?author.
    $author foaf:familyName $y .
    }

    GROUP BY $author
    ORDER BY DESC($cnt)
    LIMIT 10
    }
}
ORDER BY DESC($cnt)

Теперь это занимает около 15 секундdump, (больше минуты на конечной точке в сети), хотя мне кажется, что все, что он делает, это ищет 10 значений данного NameN для авторов.Если я включу также имя (foaf: данноеName), запрос может занять еще больше времени.Кроме того, когда я выбираю имена без группировки по автору, они выполняются в течение доли секунды:

PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX pro: <http://purl.org/spar/pro/>
PREFIX frbr: <http://purl.org/vocab/frbr/core#>
PREFIX fabio: <http://purl.org/spar/fabio/>

SELECT $author $first_name $last_name WHERE {

    $jnl a fabio:Journal;
    dcterms:title "Nature" . 
    $volm frbr:partOf $jnl . 
    $issue frbr:partOf $volm .

    $artcl frbr:partOf $issue . 
    ?artcl pro:isDocumentContextFor ?artcl_trbts . 
    ?artcl_trbts pro:isHeldBy ?author.
    $author foaf:familyName $last_name .
    $author foaf:givenName $first_name .
    }
LIMIT 10

Может кто-нибудь сказать мне, что я здесь не так делаю?Заранее спасибо!

...