2026-09-22 Benchmarkmaxxing
La Novitade
Section titled “La Novitade”https://api-stg.opencitations.net/skg-if/v1/products?filter=cf.search.title:coviddi
SPARQL
Section titled “SPARQL”Descrizioni dei servizi
- http://sparql-stg.opencitations.net/index/description
- http://sparql-stg.opencitations.net/meta/description
- http://sparql-stg.opencitations.net/.well-known/void
Index
- http://sparql-stg.opencitations.net/static/service-descriptions/index.html
- http://sparql-stg.opencitations.net/static/service-descriptions/index.ttl
- http://sparql-stg.opencitations.net/static/service-descriptions/index.jsonld
- http://sparql-stg.opencitations.net/static/service-descriptions/index.rdf
- http://sparql-stg.opencitations.net/static/service-descriptions/index.nt
Meta
- http://sparql-stg.opencitations.net/static/service-descriptions/meta.html
- http://sparql-stg.opencitations.net/static/service-descriptions/meta.ttl
- http://sparql-stg.opencitations.net/static/service-descriptions/meta.jsonld
- http://sparql-stg.opencitations.net/static/service-descriptions/meta.rdf
- http://sparql-stg.opencitations.net/static/service-descriptions/meta.nt
VoID
- http://sparql-stg.opencitations.net/static/service-descriptions/void.html
- http://sparql-stg.opencitations.net/static/service-descriptions/void.ttl
- http://sparql-stg.opencitations.net/static/service-descriptions/void.jsonld
- http://sparql-stg.opencitations.net/static/service-descriptions/void.rdf
- http://sparql-stg.opencitations.net/static/service-descriptions/void.nt
RAMOSE
Section titled “RAMOSE”Ho trovato un bug di performance. RAMOSE usava una sola sessione HTTP condivisa (requests.Session) e il valore predefinito della libreria teneva aperte solo dieci connessioni. Oltre quella soglia requests butta via la connessione TCP e ne crea una nuova. Ho sovrascritto con 100.
Benchmark
Section titled “Benchmark”Esperimento 1
Section titled “Esperimento 1”Input: un DOI
Output: OMID dell’opera richiesta, citazioni in entrata e metadati delle opere citanti
Query remote: una federazione su un singolo articolo
Campionamento: 100 DOI, 20 con 0 opere citanti, 20 con 1-9, 20 con 10-49, 20 con 50-99 e 20 con almeno 100
Livelli di concorrenza: 1, 4, 16
Misurazioni: 6.000 = 100 DOI * 2 strategie * 10 ripetizioni * 3 livelli di concorrenza
Primi risultati, SERVICE è più veloce, con una leggera inversione oltre le 100 opere citanti. Ecco le mediane
| Opere citanti | Concorrenza 1, SERVICE / orchestrazione | Concorrenza 4, SERVICE / orchestrazione | Concorrenza 16, SERVICE / orchestrazione |
|---|---|---|---|
| Tutte le fasce | 48,5 / 65,5 ms | 59,1 / 80,9 ms | 391,1 / 398,8 ms |
| 0 | 48,5 / 52,8 ms | 51,8 / 55,9 ms | 184,5 / 234,8 ms |
| 1-9 | 52,4 / 57,6 ms | 55,0 / 63,3 ms | 254,3 / 293,9 ms |
| 10-49 | 26,2 / 69,0 ms | 41,9 / 77,1 ms | 327,3 / 355,6 ms |
| 50-99 | 47,0 / 86,9 ms | 67,0 / 101,3 ms | 492,7 / 501,7 ms |
| 100+ | 148,0 / 149,2 ms | 210,5 / 202,0 ms | 1.072,9 / 970,6 ms |
E qui interviene la sofisticata arte del benchmarkmaxxing.




Stiamo mettendo sotto stress il SERVICE? Manco penniente.
Ci sono delle operazioni sulle API di OC che metterebbero sotto sforzo il SERVICE? Sì: quelle che chiedono più entità alla volta, perché il numero di chiamate al server federato aumentano.
Ok, e volendo essere ancora più stronzi? Si potrebbe fare una cosa tipo /venue-citation-count. Si parte da un ISSN, si trovano tutti gli articoli associati e per ciascuno si federa a Index
Esperimento 2
Section titled “Esperimento 2”Input: un ISSN
Output: OMID degli articoli della rivista, loro citazioni in entrata e metadati delle opere citanti
Query remote: da 6 a 9.427 articoli per rivista
Campionamento: 4 ISSN scelti nelle fasce 1-9, 10-99, 100-999 e 1.000-9.999 articoli
Misurazioni: 240 = 5 ISSN * 4 fasce * 2 livelli di concorrenza * 2 strategie * 3 ripetizioni
| Articoli | Concorrenza | SERVICE: latenza / successo / chiamate medie-massime | Orchestrazione: latenza / successo / chiamate medie-massime |
|---|---|---|---|
| 1-9 | 1 | 168,1 ms / 100% / 4,8-9 | 58,1 ms / 100% / 1-1 |
| 1-9 | 16 | 304,7 ms / 100% / 4,8-9 | 585,3 ms / 100% / 1-1 |
| 10-99 | 1 | 3.295,4 ms / 100% / 65,6-97 | 667,7 ms / 100% / 1-1 |
| 10-99 | 16 | 5.028,8 ms / 100% / 65,6-97 | 4.589,8 ms / 100% / 1-1 |
| 100-999 | 1 | 13.131,7 ms / 100% / 245,8-300 | 794,7 ms / 100% / 1-1 |
| 100-999 | 16 | 15.499,1 ms / 100% / 245,8-300 | 13.785,5 ms / 100% / 1-1 |
| 1.000-9.999 | 1 | nessuna / 0% / 3.752,4-3.983 | 1.466,1 ms / 20% / 1-1 |
| 1.000-9.999 | 16 | nessuna / 0% / 3.752,4-3.983 | 15.106,7 ms / 20% / 1-1 |
| Già meglio. L’orchestrazione fallisce perché Virtuoso manda a QLever tutti gli OMID in un colpo solo con @@values |
Aggiungo: @@values <var>... [batch_size=<positive integer>]
| Articoli | Concorrenza | SERVICE: latenza / successo / richieste backend medie-massime | Orchestrazione: latenza / successo / richieste backend medie-massime |
|---|---|---|---|
| 1-9 | 1 | 200,6 ms / 100% / 5,2-9 | 87,2 ms / 100% / 3-3 |
| 1-9 | 16 | 388,3 ms / 100% / 5,2-9 | 439,6 ms / 100% / 3-3 |
| 10-99 | 1 | 4.093,8 ms / 100% / 66,6-98 | 902,5 ms / 100% / 3-3 |
| 10-99 | 16 | 7.869,5 ms / 100% / 66,6-98 | 10.252,4 ms / 100% / 3-3 |
| 100-999 | 1 | 14.843,1 ms / 100% / 246,8-301 | 1.742,0 ms / 100% / 3-3 |
| 100-999 | 16 | 18.219,4 ms / 100% / 246,8-301 | 18.607,9 ms / 100% / 3-3 |
| 1.000-9.999 | 1 | 374.998,0 ms / 86,7% / 16.815,6-28.284 | 77.036,5 ms / 100% / 16,6-31 |
| 1.000-9.999 | 16 | 153.507,0 ms / 53,3% / 16.815,6-28.284 | 257.809,9 ms / 100% / 16,6-31 |
chore(benchmark): give both stores enough memory and CPU and measure at 8 clients
Virtuoso now holds most of Meta in 44 GB of buffers and QLever runs without a CPU cap, so timeouts no longer come from a starved database. Concurrency drops from 16 to 8 because 16 heavy requests saturate the host and the benchmark would measure the machine rather than the two federation strategies.
| Articoli | Concorrenza | SERVICE: latenza / successo / richieste backend medie-massime | Orchestrazione: latenza / successo / richieste backend medie-massime |
|---|---|---|---|
| 1-9 | 1 | 156,8 ms / 100% / 5,2-9 | 64,3 ms / 100% / 3-3 |
| 1-9 | 8 | 174,3 ms / 100% / 5,2-9 | 85,7 ms / 100% / 3-3 |
| 10-99 | 1 | 3.029,5 ms / 100% / 66,6-98 | 118,1 ms / 100% / 3-3 |
| 10-99 | 8 | 3.018,0 ms / 100% / 66,6-98 | 239,9 ms / 100% / 3-3 |
| 100-999 | 1 | 12.557,6 ms / 100% / 246,8-301 | 215,6 ms / 100% / 3-3 |
| 100-999 | 8 | 12.492,9 ms / 100% / 246,8-301 | 435,6 ms / 100% / 3-3 |
| 1.000-9.999 | 1 | 207.908,3 ms / 100% / 5.605,2-9.428 | 10.319,4 ms / 100% / 16,6-31 |
| 1.000-9.999 | 8 | 211.291,5 ms / 100% / 5.605,2-9.428 | 13.063,5 ms / 100% / 16,6-31 |
E questo direi che va nell’articolo


fix: drop the @@foreach directive
@@values covers the same ground with far fewer requests: paired with GROUP BY
it yields per-item aggregates, and it sends one query per batch instead of one
per value.
fix: bind client values before sparql substitution
Escape literals and validate IRIs in reads, updates, and YAML templates, returning HTTP 400 for rejected placeholder values.
feat(filters): automatically split searched values like the QLever tokenizer does if ql:has-word is found in the query
Documentazione
Section titled “Documentazione”fix(docs): preserve code casing and wrap long headings


fix(docs): reduce horizontal margins on small screens


fix(docs): adapt navigation to available space and align operation cards




fix(docs): up to 850px give labels and values the full available width


fix(docs): reduce nested list indentation on small screens


fix(docs): left-align text on small screens to avoid stretched word spacing


feat(docs): expand JSON examples in a full-screen dialog


feat: search provenance through a custom QLever URI index
Qvindi si può lanciare il benchmark con BEAR. Per fare un confronto, per tirare su BEAR A Fuseki impiega 34 h 39 m, QLever 1 h 55 m. BEAR A ha
Bear A non è piccolo
Dataset: 65,926,511 quad
Provenance: 1,984,865,652 quads
Totale: 2,050,792,163 quads
Ho corretto a mano le 29 br (non 42) non correggibili automaticamente

Domande
Section titled “Domande”- Serve una seconda cover letter per la resubmission di IEEE Access?
- Che ne dite di switchare da Virtuoso a Qlever per Meta? L’indice testuale più o meno va. Non ci sono ancora i merge ma intanto recuperiamo un sacco di risorse (che mi servono per i benchmark di BEAR)
