Набор данных Jena в памяти, по-видимому, работает медленно при выполнении запросов SPARQL

#sparql #jena

#sparql #jena

Вопрос:

Раньше я DatasetFactory.createTxnMem() создавал набор данных в памяти, затем загружал модель RDF в этот набор данных с помощью setDefaultModel() . Модель имеет около 275 ТЫС. троек, и запросы SPARQL, отправляемые в этот набор данных, похоже, не так быстры, как мы надеялись (мы ожидаем, что это будет быстрее, поскольку это набор данных в памяти).

Мы что-нибудь пропустили? например, можем ли мы добавить систему индексации к этому набору данных в памяти?

Спасибо за помощь!

добавьте следующий запрос в качестве примера:

     PREFIX owl: <http://www.w3.org/2002/07/owl#> 
    PREFIX hp: <http://purl.obolibrary.org/obo/HP_> 
    PREFIX skos: <http://www.w3.org/2004/02/skos/core#> 
    PREFIX envo: <http://purl.obolibrary.org/obo/ENVO_> 
    PREFIX stato: <http://purl.obolibrary.org/obo/STATO_> 
    PREFIX ncit: <http://purl.obolibrary.org/obo/NCIT_> 
    PREFIX pato: <http://purl.obolibrary.org/obo/PATO_> 
    PREFIX dcterms: <http://purl.org/dc/terms/> 
    PREFIX uo: <http://purl.obolibrary.org/obo/UO_> 
    PREFIX mi: <http://purl.obolibrary.org/obo/MI_> 
    PREFIX cogpo: <http://www.cogpo.org/ontologies/working/CogPOver2011.owl#COGPO_> 
    PREFIX exo: <http://purl.obolibrary.org/obo/ExO_> 
    PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
    PREFIX omre: <http://purl.obolibrary.org/obo/ogms/OMRE_> 
    PREFIX ctxid: <http://purl.org/twc/ctxid/> 
    PREFIX geno: <http://purl.obolibrary.org/obo/GENO_> 
    PREFIX maxo: <http://purl.obolibrary.org/obo/MAXO_> 
    PREFIX nbo: <http://purl.obolibrary.org/obo/NBO_> 
    PREFIX hhear: <http://purl.org/twc/HHEAR_> 
    PREFIX omit: <http://purl.obolibrary.org/obo/OMIT_> 
    PREFIX uniprot: <http://www.uniprot.org/uniprot/> 
    PREFIX pubchem: <http://rdf.ncbi.nlm.nih.gov/pubchem/compound/> 
    PREFIX symp: <http://purl.obolibrary.org/obo/SYMP_> 
    PREFIX autism-core: <http://purl.org/autism-ontology/1.0/autism-core.owl#> 
    PREFIX cmo: <http://purl.obolibrary.org/obo/CMO_> 
    PREFIX chebi: <http://purl.obolibrary.org/obo/CHEBI_> 
    PREFIX vstoi: <http://hadatac.org/ont/vstoi#> 
    PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 
    PREFIX doid: <http://purl.obolibrary.org/obo/DOID_> 
    PREFIX cogat: <http://www.cognitiveatlas.org/ontology/cogat.owl#CAO_> 
    PREFIX hhear-kb: <http://hadatac.org/kb/hhear#> 
    PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
    PREFIX ogms: <http://purl.obolibrary.org/obo/OGMS_> 
    PREFIX aero: <http://purl.obolibrary.org/obo/AERO_> 
    PREFIX oae: <http://purl.obolibrary.org/obo/OAE_> 
    PREFIX dct: <http://purl.org/dc/terms/> 
    PREFIX sio: <http://semanticscience.org/resource/> 
    PREFIX prov: <http://www.w3.org/ns/prov#> 
    PREFIX hasco: <http://hadatac.org/ont/hasco/> 
    PREFIX uberon: <http://purl.obolibrary.org/obo/UBERON_> 
    PREFIX oboInOwl: <http://www.geneontology.org/formats/oboInOwl#> 
    PREFIX cl: <http://purl.obolibrary.org/obo/CL_> 
    PREFIX RID: <http://www.radlex.org/RID/#> 
    PREFIX efo: <http://www.ebi.ac.uk/efo/EFO_> 
    PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
    PREFIX obi: <http://purl.obolibrary.org/obo/OBI_> 
    PREFIX fma: <http://purl.obolibrary.org/obo/FMA_> 
    PREFIX wikidata: <http://www.wikidata.org/wiki/> 
    PREFIX obo: <http://purl.obolibrary.org/obo/> 
    
SELECT ?ocType ?comment ?studyUri ?hasScopeUri ?hasRoleLabel ?hasVirtualColumnUri ?spaceScopeUri ?timeScopeUri ?lastCounter WHERE { 
    <http://hadatac.org/kb/hhear#SOC-2016-34-PSAMPLES> a ?ocType . 
    <http://hadatac.org/kb/hhear#SOC-2016-34-PSAMPLES> hasco:isMemberOf ?studyUri . 
    OPTIONAL { <http://hadatac.org/kb/hhear#SOC-2016-34-PSAMPLES> rdfs:comment ?comment } . 
    OPTIONAL { <http://hadatac.org/kb/hhear#SOC-2016-34-PSAMPLES> hasco:hasScope ?hasScopeUri } . 
    OPTIONAL { <http://hadatac.org/kb/hhear#SOC-2016-34-PSAMPLES> hasco:hasReference ?hasVirtualColumnUri } . 
    OPTIONAL { <http://hadatac.org/kb/hhear#SOC-2016-34-PSAMPLES> hasco:hasRoleLabel ?hasRoleLabel } . 
    OPTIONAL { <http://hadatac.org/kb/hhear#SOC-2016-34-PSAMPLES> hasco:hasLastCounter ?lastCounter } . 
}
 

Комментарии:

1. В этом вопросе отсутствует много деталей, что делает невозможным ответ как есть. Быстрее по сравнению с чем? Методология сравнительного анализа (учитывали ли вы эффекты cold-JVM и JIT)? Примеры запросов SPARQL и фрагментов данных, демонстрирующих производительность?

2. Спасибо @RobV! ну, мы используем Blazegraph для хранения наших троек (их 275 тыс.), Затем мы используем Jena для выполнения запросов SPARQL, отправляя запросы в конечную точку blazegraph. Теперь мы создали модель в памяти, которая отражает график в blazegraph, и реализовали те же запросы к этому графику в памяти. Производительность остается практически такой же — мы надеялись увидеть значительное улучшение, поскольку теперь у нас есть модель в памяти, а не отправка запросов на другой сервер. Итак, это заставляет нас задать вопрос «есть ли способ добавить некоторую систему индексации к этому графику в памяти»?

3. как вы думаете, почему не используется какой-либо «индекс»? Jena в памяти использует Java Maps, и есть по крайней мере какой-то индекс для spo, pos, osp, см. github.com/apache/jena/blob/master/jena-core/src/main/java/org / … — я думаю, такой небольшой набор данных также может храниться в памяти Blazegraph. Более того, планы выполнения запросов могут отличаться в зависимости от используемой статистики. Вы также должны показать несколько примеров запросов. И, возможно, также укажите текущее время выполнения

4. Спасибо @UninformedUser! это ключевой вопрос, который мы хотим знать — существует ли уже какой-то индекс, используемый для набора данных в памяти. Я думаю, мы просто слишком ленивы, чтобы читать исходный код. Это существующая система, и мы не уверены, как было принято решение разместить график в blazegraph, но использовать Jena для выполнения запроса. Позвольте мне опубликовать один пример запроса в моем исходном вопросе, потому что он слишком большой, чтобы поместиться здесь.

5. спасибо, так сколько времени занимает этот запрос с Jena? Я вижу два тройных шаблона, которые могут использовать spo индекс, а затем кучу OPTIONAL других левых соединений.