#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
других левых соединений.