diff --git a/.idea/claudeCodeEditorTabs.xml b/.idea/claudeCodeEditorTabs.xml
deleted file mode 100644
index 057cca1..0000000
--- a/.idea/claudeCodeEditorTabs.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/README.md b/README.md
index 5639e0a..bb761f3 100644
--- a/README.md
+++ b/README.md
@@ -32,14 +32,19 @@ To view it locally:
make site # serves at http://localhost:8080
```
-**Dashboard features:**
-
-- **Scalability charts** — when a single dataset is selected, Performance charts switch to line charts (X = graph size in triples) showing how each engine scales
-- **W3C Conformance** — live pass/fail results fetched from [corese-stack.github.io/corese-w3c](https://corese-stack.github.io/corese-w3c/data/w3c-report.json) (All mode only)
-- **Shareable URLs** — state (dataset, engine filter, reference engine) is encoded in the URL (`?ds=dbpedia&engines=corese.4.6.5,jena.6.2.0&ref=corese.4.6.5`)
-- **Export CSV** — exports the currently filtered results directly from the browser (Full results section)
-- **Engine filter** — click engine cards to filter charts; click × on pills to remove from comparison
-- **SPARQL section** — per-engine latency cards, median per query, color-coded comparison table
+**Dashboard features (v2):**
+
+- **Per-dataset pages** — Bowlogna, BSBM, LUBM, DBpedia each have two sub-sections: *Ingestion & Memory* and *SPARQL Queries*
+- **Ingestion charts** — heap memory over time (bi-axis), average throughput (t/s), average CPU usage (%) — all side by side
+- **SPARQL query chart** — grouped bar chart per query, with hatched bars for timeouts (> 60 s); log scale toggle on BSBM
+- **Result tables** — sortable; filter by All / Best per File (ingestion) or All / Best per Query / PASS / Failures (queries)
+- **Engine bar** — toggle engines on/off, drag-and-drop to reorder; order reflects in all charts
+- **DBpedia Scale** — bilogarithmic scatter plot (triples × loading time) + memory efficiency chart
+- **W3C Conformance** — live SPARQL 1.1 test results from [corese-stack.github.io/corese-w3c](https://corese-stack.github.io/corese-w3c/data/w3c-report.json)
+- **Environment & Protocol** — machine specs, JVM flags, measurement protocol details
+- **Export** — JSON (raw data), Query CSV, Markdown report, PDF
+- **Per-chart actions** — PNG download (↓) and fullscreen expand (⛶) on every chart
+- **Theme toggle** — dark / light mode, persisted in `localStorage`
---
@@ -89,12 +94,7 @@ python python-utils/workflow.py \
#### 3. Read the result
-Open `site/index.html`. The `corese.local` card shows:
-
-- `+X% improvement` (green)
-- `−X% regression` (red)
-
-relative to `corese.4.6.5` as the fixed reference (100/100).
+Open `site/index.html`. Navigate to the dataset page (Bowlogna, BSBM, LUBM, or DBpedia) to compare ingestion time, throughput, memory and CPU usage between `corese.local` and the reference engines. The SPARQL Queries sub-section shows per-query median latency and PASS/TIMEOUT/ERROR status.
---
@@ -140,12 +140,12 @@ For datasets that have associated queries (Bowlogna, BSBM):
python python-utils/workflow.py --engines corese.local,corese.4.6.5 --dataset bowlogna
```
-The **SPARQL Queries** section appears in the dashboard with:
+The **SPARQL Queries** sub-section appears in the dashboard with:
-- Per-engine latency cards: avg, p50, p95, p99
-- Median time per query and per engine
-- Color-coded comparison table (green = best, orange = ×5–19, red = ×20+)
-- `—` indicates timeout or error
+- Grouped bar chart — median time per query per engine, hatched bars for timeouts
+- Result table — sortable by query, engine, status, median ms, TTFR, row count
+- Filters — All results / Best per Query / PASS only / Failures
+- Click a status badge to inspect raw repetition times and result hash
---
diff --git a/site/app.js b/site/app.js
deleted file mode 100644
index 80169f7..0000000
--- a/site/app.js
+++ /dev/null
@@ -1,2481 +0,0 @@
-'use strict';
-
-// ── Palette ───────────────────────────────────────────────────────────────────
-//
-// Two levels:
-// 1. ENGINE_FAMILIES → color by family (prefix before the first ".")
-// e.g. all "corese.*" versions share the same blue
-// 2. ENGINE_OVERRIDES → specific color for an exact engine name
-// e.g. "corese.local" gets a lighter blue
-//
-// To add an engine: add an entry in ENGINE_FAMILIES or ENGINE_OVERRIDES.
-// No match → color auto-assigned from AUTO_COLORS.
-
-const ENGINE_FAMILIES = {
- // family hex bg (same hex + 0.75 opacity)
- corese: { hex: '#4472C4', bg: 'rgba(68,114,196,0.75)' },
- jena: { hex: '#ED7D31', bg: 'rgba(237,125,49,0.75)' },
- rdf4j: { hex: '#70AD47', bg: 'rgba(112,173,71,0.75)' },
- oxigraph:{ hex: '#E05C5C', bg: 'rgba(224,92,92,0.75)' },
- blazegraph:{ hex: '#9B59B6', bg: 'rgba(155,89,182,0.75)'},
-};
-
-const ENGINE_OVERRIDES = {
- // Corese dev versions — light blue, same family as stable Corese
- 'corese.local': { hex: '#5B9BD5', bg: 'rgba(91,155,213,0.75)' },
- 'corese.next': { hex: '#5B9BD5', bg: 'rgba(91,155,213,0.75)' },
-};
-
-// Fallback colors auto-assigned (priority order) for unknown engines
-const AUTO_COLORS = [
- { hex: '#E74C3C', bg: 'rgba(231,76,60,0.75)' },
- { hex: '#9B59B6', bg: 'rgba(155,89,182,0.75)' },
- { hex: '#1ABC9C', bg: 'rgba(26,188,156,0.75)' },
- { hex: '#F39C12', bg: 'rgba(243,156,18,0.75)' },
- { hex: '#2ECC71', bg: 'rgba(46,204,113,0.75)' },
- { hex: '#E91E63', bg: 'rgba(233,30,99,0.75)' },
- { hex: '#00BCD4', bg: 'rgba(0,188,212,0.75)' },
- { hex: '#FF5722', bg: 'rgba(255,87,34,0.75)' },
-];
-
-// Known engine versions (order preserved in pills, filtered to what's in data)
-const KNOWN_ENGINE_ORDER = [
- 'corese.next', 'corese.local', 'corese.4.6.5', 'corese.4.6.4', 'corese.4.6.3',
- 'jena.6.2.0', 'jena.6.1.0', 'jena.6.0.0',
- 'rdf4j.5.3.2', 'rdf4j.5.3.1', 'rdf4j.5.3.0',
-];
-
-// Dynamic resolution: builds engine → color map from data
-let ENGINE_COLOR_MAP = {};
-
-function buildColorMap(engines) {
- let autoIdx = 0;
- for (const engine of engines) {
- if (ENGINE_COLOR_MAP[engine]) continue; // already assigned
-
- if (ENGINE_OVERRIDES[engine]) {
- ENGINE_COLOR_MAP[engine] = ENGINE_OVERRIDES[engine];
- } else {
- const family = engine.split('.')[0].toLowerCase();
- if (ENGINE_FAMILIES[family]) {
- ENGINE_COLOR_MAP[engine] = ENGINE_FAMILIES[family];
- } else {
- ENGINE_COLOR_MAP[engine] = AUTO_COLORS[autoIdx % AUTO_COLORS.length];
- autoIdx++;
- }
- }
- }
-}
-
-function pal(engineName) {
- return ENGINE_COLOR_MAP[engineName]
- ?? { hex: '#8b949e', bg: 'rgba(139,148,158,0.7)' };
-}
-
-function badgeCls(engineName) {
- // Cherche la famille connue, sinon 'unknown'
- const family = engineName.split('.')[0].toLowerCase();
- return ENGINE_FAMILIES[family] ? `badge-${family}` : 'badge-unknown';
-}
-
-// ── Data loading ──────────────────────────────────────────────────────────────
-async function loadData() {
- try {
- const res = await fetch('data/benchmark-report.json');
- if (!res.ok) throw new Error(res.statusText);
- return await res.json();
- } catch (_) {
- if (typeof window.__BENCHMARK_DATA__ !== 'undefined') return window.__BENCHMARK_DATA__;
- throw new Error('No data. Run the benchmark first.');
- }
-}
-
-// ── Utilitaires ───────────────────────────────────────────────────────────────
-const fmt = (n, d = 0) =>
- n == null ? '—' : Number(n).toLocaleString('fr-FR', { maximumFractionDigits: d });
-
-function shortFile(f) { return f.replace('_en.nt', '').replace(/_/g, ' '); }
-
-function formatDate(iso) {
- return new Date(iso).toLocaleString('fr-FR', {
- day: '2-digit', month: '2-digit', year: 'numeric',
- hour: '2-digit', minute: '2-digit',
- });
-}
-
-// ── Theme ─────────────────────────────────────────────────────────────────────
-const THEMES = ['auto', 'light', 'dark'];
-let themeIdx = THEMES.indexOf(localStorage.getItem('theme') ?? 'auto');
-
-function applyTheme() {
- const theme = THEMES[themeIdx];
- const icons = { auto: 'icon-auto', light: 'icon-sun', dark: 'icon-moon' };
-
- if (theme === 'auto') document.documentElement.removeAttribute('data-theme');
- else document.documentElement.setAttribute('data-theme', theme);
-
- ['icon-auto', 'icon-sun', 'icon-moon'].forEach(id => {
- const el = document.getElementById(id);
- if (el) el.style.display = id === icons[theme] ? '' : 'none';
- });
- localStorage.setItem('theme', theme);
-}
-
-document.getElementById('theme-toggle')?.addEventListener('click', () => {
- themeIdx = (themeIdx + 1) % THEMES.length;
- applyTheme();
-});
-
-applyTheme();
-
-// ── Dataset metadata ──────────────────────────────────────────────────────────
-//
-// Maps dataset label → { label, description, url }
-// Add a new entry here when a new dataset is supported.
-const DATASET_META = {
- dbpedia: {
- label: 'DBpedia',
- description: 'Real-world RDF dump — 5 N-Triples files from DBpedia 3.5.1',
- url: 'https://downloads.dbpedia.org/3.5.1/en/',
- fileBaseUrl: 'https://downloads.dbpedia.org/3.5.1/en/',
- hasSparql: false,
- },
- bowlogna: {
- label: 'Bowlogna',
- description: 'Synthetic university dataset with SPARQL queries (HOBBIT benchmark)',
- url: 'https://files.dice-research.org/projects/HOBBIT/benchmarks-data/datasets-dumps/bowlogna-dump.zip',
- fileBaseUrl: null,
- hasSparql: true,
- },
- bsbm: {
- label: 'BSBM',
- description: 'Berlin SPARQL Benchmark — synthetic e-commerce dataset',
- url: 'https://sourceforge.net/projects/bsbmtools/',
- fileBaseUrl: null,
- hasSparql: true,
- },
- lubm: {
- label: 'LUBM',
- description: 'Lehigh University Benchmark — university domain with RDFS reasoning',
- url: 'https://swat.cse.lehigh.edu/projects/lubm/',
- fileBaseUrl: null,
- hasSparql: true,
- },
-};
-
-function renderDatasetCards(runs, queries) {
- const datasets = [...new Set(runs.map(r => r.dataset))];
- const grid = document.getElementById('dataset-grid');
- if (!grid) return;
- const meta = document.getElementById('datasets-meta');
- if (meta) meta.textContent = `${datasets.length} dataset${datasets.length > 1 ? 's' : ''}`;
-
- grid.innerHTML = datasets.map(ds => {
- const meta = DATASET_META[ds.toLowerCase()] ?? { label: ds, description: '', url: null };
- const dsRuns = runs.filter(r => r.dataset === ds);
- const files = [...new Set(dsRuns.map(r => r.file))];
- const engines = [...new Set(dsRuns.map(r => r.engine))];
- const totalTrip = dsRuns.reduce((s, r) => s + r.triples, 0) / engines.length;
-
- const linkHtml = meta.url
- ? `
-
- Source
- `
- : '';
-
- // File tags
- const fileTags = files.map(f =>
- `${shortFile(f)}`
- ).join('');
-
- // SPARQL queries collapsible (only if queries embedded in JSON et dataset hasSparql)
- let queriesHtml = '';
- if (queries && queries.length > 0 && (DATASET_META[ds.toLowerCase()]?.hasSparql ?? false)) {
- const queryItems = queries.map((q, i) => `
-
-
Q${i + 1}
-
${q.trim().replace(/
- `).join('');
- queriesHtml = `
-
-
-
- ${queries.length} SPARQL queries
-
- ${queryItems}
- `;
- }
-
- return `
-
-
- ${meta.description ? `
${meta.description}
` : ''}
-
-
-
Files
-
${files.length}
-
-
-
Total triples
-
${fmt(totalTrip, 0)}
-
-
-
Format
-
N-Triples (.nt)
-
-
-
${fileTags}
- ${queriesHtml}
-
`;
- }).join('');
-}
-
-
-// ── Table sort state ─────────────────────────────────────────────────────────
-let sortField = null;
-let sortAsc = true;
-
-function initTableSort() {
- document.querySelectorAll('th[data-sort]').forEach(th => {
- th.style.cursor = 'pointer';
- th.addEventListener('click', () => {
- const field = th.dataset.sort;
- if (sortField === field) {
- sortAsc = !sortAsc;
- } else {
- sortField = field;
- sortAsc = true;
- }
- // Update indicators
- document.querySelectorAll('th[data-sort]').forEach(h => {
- h.classList.remove('sort-asc', 'sort-desc');
- });
- th.classList.add(sortAsc ? 'sort-asc' : 'sort-desc');
- updateTable();
- });
- });
-}
-
-// ── Engine filter state ───────────────────────────────────────────────────────
-// activeEngines: Set of selected engine names. Empty = all engines shown.
-let activeEngines = new Set();
-let hiddenEngines = new Set(); // engines removed from comparator bar via ×
-let allCharts = {};
-let activeDatasets = new Set();
-let userRefEngine = localStorage.getItem('refEngine') ?? null;
-let metadataQueries = null;
-
-// ── Header ────────────────────────────────────────────────────────────────────
-
-function renderHeader(meta, runs) {
- const datasets = [...new Set(runs.map(r => r.dataset))];
- const engines = [...new Set(runs.map(r => r.engine))];
-
-
- const enginePills = document.getElementById('engine-pills');
- if (enginePills) {
- const sorted = [
- ...KNOWN_ENGINE_ORDER.filter(e => engines.includes(e)),
- ...engines.filter(e => !KNOWN_ENGINE_ORDER.includes(e)),
- ];
- enginePills.innerHTML = sorted.map(engine => {
- const dot = engine.indexOf('.');
- const family = dot >= 0 ? engine.slice(0, dot) : engine;
- const version = dot >= 0 ? engine.slice(dot + 1) : engine;
- const p = pal(engine);
- return `
- ${family}
- ${version}
-
-
`;
- }).join('');
- // Attach drag handlers to newly created pills
- enginePills.querySelectorAll('.engine-pill[data-engine]').forEach(attachPillDragHandlers);
- }
-}
-
-function renderSidebarMeta(meta, engines, runs, queryRuns) {
- // Badges
- const datasets = [...new Set(runs.map(r => r.dataset))];
- const el = id => document.getElementById(id);
- if (el('sidebar-badge-datasets')) el('sidebar-badge-datasets').textContent = datasets.length;
- if (el('sidebar-badge-engines')) el('sidebar-badge-engines').textContent = engines.length;
- if (el('sidebar-badge-results')) el('sidebar-badge-results').textContent = runs.length;
- if (queryRuns && queryRuns.length > 0) {
- const queryIds = [...new Set(queryRuns.map(r => r.queryId))];
- if (el('sidebar-badge-sparql')) el('sidebar-badge-sparql').textContent = queryIds.length + ' q';
- const sparqlNav = document.getElementById('sidebar-sparql-nav');
- if (sparqlNav) sparqlNav.style.display = '';
- }
- // Footer meta
- const box = document.getElementById('sidebar-meta');
- if (box) {
- const rows = [
- ['Date', formatDate(meta.generatedAt)],
- ['Java', `${meta.java ?? '—'}`],
- ['OS', meta.os ?? '—'],
- ['Protocol', meta.protocol ? `${meta.protocol.repetitions} reps + warmup` : '—'],
- ];
- box.innerHTML = `
- Run context
-
- ${rows.map(([k, v]) => `- ${k}
- ${v}
`).join('')}
-
- `;
- }
-}
-
-// ── Run info bar ──────────────────────────────────────────────────────────────
-function renderRunInfo(meta) {
- document.getElementById('info-date').textContent = formatDate(meta.generatedAt);
- document.getElementById('info-java').textContent = meta.java ?? '—';
- document.getElementById('info-os').textContent = meta.os ?? '—';
- document.getElementById('info-protocol').textContent =
- `${meta.protocol.repetitions} repetitions + warmup`;
-}
-
-// ── KPIs ──────────────────────────────────────────────────────────────────────
-let _overviewBarChart = null;
-let _overviewRadarChart = null;
-
-function renderKPI(runs) {
- if (!runs || runs.length === 0) return;
- const engines = [...new Set(runs.map(r => r.engine))];
- const datasets = [...new Set(runs.map(r => r.dataset))];
- const files = [...new Set(runs.map(r => r.file))];
-
- // Per-engine avg for the winner cards
- const byEngine = {};
- engines.forEach(e => {
- const er = runs.filter(r => r.engine === e);
- byEngine[e] = {
- avgThru: er.reduce((s,r) => s + r.throughputTriplesPerSec, 0) / er.length,
- avgMem: er.reduce((s,r) => s + r.memoryDeltaMb, 0) / er.length,
- avgTime: er.reduce((s,r) => s + r.loadingTimeMs, 0) / er.length,
- };
- });
-
- const bestThruEngine = engines.reduce((a,b) => byEngine[a].avgThru > byEngine[b].avgThru ? a : b);
- const bestMemEngine = engines.reduce((a,b) => byEngine[a].avgMem < byEngine[b].avgMem ? a : b);
- const bestTimeEngine = engines.reduce((a,b) => byEngine[a].avgTime < byEngine[b].avgTime ? a : b);
-
- function winnerCard(label, engine, value, sub) {
- const p = pal(engine);
- return `
-
${label}
-
-
- ${engine}
-
-
${value}
-
${sub}
-
`;
- }
-
- const contextCard = `
-
${engines.length}engines
-
${datasets.length}datasets
-
${files.length}files
-
`;
-
- document.getElementById('metrics-grid').innerHTML =
- winnerCard('Best throughput', bestThruEngine,
- fmt(byEngine[bestThruEngine].avgThru, 0) + ' t/s', 'avg triples/s across all files') +
- winnerCard('Best memory', bestMemEngine,
- fmt(byEngine[bestMemEngine].avgMem, 1) + ' MB', 'avg memory Δ across all files') +
- winnerCard('Best load time', bestTimeEngine,
- fmt(byEngine[bestTimeEngine].avgTime, 0) + ' ms', 'avg loading time across all files') +
- contextCard;
-
- const meta = document.getElementById('overview-meta');
- if (meta) meta.textContent = `${engines.length} engines · ${datasets.length} datasets · ${files.length} files`;
-
- _renderOverviewCharts(engines, byEngine);
-}
-
-function _renderOverviewCharts(engines, byEngine) {
- const isDark = document.documentElement.getAttribute('data-theme') !== 'light';
- const gridCol = isDark ? 'rgba(255,255,255,0.06)' : 'rgba(0,0,0,0.06)';
- const textCol = isDark ? '#8b949e' : '#57606a';
-
- // ── Bar: avg loading time ─────────────────────────────────────────────
- const barCtx = document.getElementById('chart-overview-bar')?.getContext('2d');
- if (barCtx) {
- if (_overviewBarChart) _overviewBarChart.destroy();
- _overviewBarChart = new Chart(barCtx, {
- type: 'bar',
- data: {
- labels: engines,
- datasets: [{
- label: 'Avg load time',
- data: engines.map(e => Math.round(byEngine[e].avgTime)),
- backgroundColor: engines.map(e => pal(e).bg),
- borderColor: engines.map(e => pal(e).hex),
- borderWidth: 1,
- borderRadius: 4,
- }],
- },
- options: {
- responsive: true,
- maintainAspectRatio: false,
- plugins: {
- legend: { display: false },
- tooltip: { callbacks: { label: ctx => ` ${ctx.raw.toLocaleString()} ms` } },
- },
- scales: {
- x: { grid: { display: false }, ticks: { color: textCol, font: { size: 10 } } },
- y: { beginAtZero: true, grid: { color: gridCol }, ticks: { color: textCol, font: { size: 10 }, callback: v => v.toLocaleString() } },
- },
- },
- });
- }
-
- // ── Radar: normalized scores ──────────────────────────────────────────
- const radarCtx = document.getElementById('chart-overview-radar')?.getContext('2d');
- if (radarCtx) {
- if (_overviewRadarChart) _overviewRadarChart.destroy();
-
- const maxThru = Math.max(...engines.map(e => byEngine[e].avgThru));
- const maxTime = Math.max(...engines.map(e => byEngine[e].avgTime));
- const maxMem = Math.max(...engines.map(e => byEngine[e].avgMem));
-
- const radarDatasets = engines.map(e => {
- const p = pal(e);
- // Throughput: higher = better → normalize directly
- // Load time: lower = better → invert
- // Memory: lower = better → invert
- const scoreThru = maxThru > 0 ? Math.round(byEngine[e].avgThru / maxThru * 100) : 0;
- const scoreTime = maxTime > 0 ? Math.round((1 - (byEngine[e].avgTime - Math.min(...engines.map(x=>byEngine[x].avgTime))) / maxTime) * 100) : 100;
- const scoreMem = maxMem > 0 ? Math.round((1 - (byEngine[e].avgMem - Math.min(...engines.map(x=>byEngine[x].avgMem))) / maxMem) * 100) : 100;
- return {
- label: e,
- data: [scoreThru, scoreTime, scoreMem],
- borderColor: p.hex,
- backgroundColor: p.hex + '22',
- pointBackgroundColor: p.hex,
- borderWidth: 1.8,
- pointRadius: 3,
- };
- });
-
- _overviewRadarChart = new Chart(radarCtx, {
- type: 'radar',
- data: {
- labels: ['Throughput', 'Load speed', 'Memory efficiency'],
- datasets: radarDatasets,
- },
- options: {
- responsive: true,
- maintainAspectRatio: false,
- plugins: {
- legend: { position: 'bottom', labels: { boxWidth: 10, padding: 10, font: { size: 10 }, color: textCol } },
- },
- scales: {
- r: {
- min: 0, max: 100,
- ticks: { display: false, stepSize: 25 },
- grid: { color: gridCol },
- angleLines: { color: gridCol },
- pointLabels: { font: { size: 11 }, color: textCol },
- },
- },
- },
- });
- }
-}
-
-// ── Engine cards ──────────────────────────────────────────────────────────────
-// Detects if an engine is a Corese development version
-const isDevCorese = e => e === 'corese.local' || e === 'corese.next' || e.startsWith('corese.commit.');
-const isStableCorese = e => e.startsWith('corese.') && !isDevCorese(e);
-
-function renderEngineCards(runs) {
- const engines = [...new Set(runs.map(r => r.engine))];
-
- // Average throughput per engine
- const avgThruMap = {};
- engines.forEach(engine => {
- const eruns = runs.filter(r => r.engine === engine);
- avgThruMap[engine] = eruns.reduce((s, r) => s + r.throughputTriplesPerSec, 0) / eruns.length;
- });
-
- // Reference: stable Corese version if present, otherwise the best engine
- const stableCorese = engines.find(isStableCorese);
- const maxAvgThru = Math.max(...Object.values(avgThruMap));
- const refEngine = userRefEngine && engines.includes(userRefEngine)
- ? userRefEngine
- : (stableCorese ?? engines.find(e => avgThruMap[e] === maxAvgThru));
- const refThru = avgThruMap[refEngine];
-
- document.getElementById('engine-grid').innerHTML = engines.map(engine => {
- const eruns = runs.filter(r => r.engine === engine);
- const avgTime = eruns.reduce((s, r) => s + r.loadingTimeMs, 0) / eruns.length;
- const avgMem = eruns.reduce((s, r) => s + r.memoryDeltaMb, 0) / eruns.length;
- const avgThru = avgThruMap[engine];
- const score = Math.round(avgThru / refThru * 100);
- const p = pal(engine);
-
- // Libellé "vitesse relative" selon le contexte
- let relativeLabel, tooltip, scoreDisplay;
- if (engine === refEngine) {
- relativeLabel = '🏆 reference';
- tooltip = 'Stable Corese reference version';
- scoreDisplay = '100 / 100';
- } else if (stableCorese && isDevCorese(engine)) {
- const delta = score - 100;
- if (delta >= 0) {
- relativeLabel = `📈 +${delta}% improvement`;
- tooltip = `${delta}% faster than ${refEngine}`;
- } else {
- relativeLabel = `📉 ${delta}% regression`;
- tooltip = `${Math.abs(delta)}% slower than ${refEngine}`;
- }
- scoreDisplay = `${score} / 100`;
- } else {
- const ratio = avgThru > 0 ? (refThru / avgThru).toFixed(1) : null;
- relativeLabel = ratio === null ? '' : ratio > 1 ? `${ratio}× slower` : `${(1/ratio).toFixed(1)}× faster`;
- tooltip = `Compared to ${refEngine}`;
- scoreDisplay = `${score} / 100`;
- }
-
- const meterW = Math.min(score, 100); // bar capped at 100% visually
-
- return `
-
-
-
-
-
Avg. time
-
${fmt(avgTime, 0)} ms
-
-
-
Avg. throughput
-
${fmt(avgThru, 0)} t/s
-
-
-
Avg. memory
-
${fmt(avgMem, 1)} MB
-
-
-
Relative speed
-
${relativeLabel}
-
-
-
-
- `;
- }).join('');
-}
-
-function syncEnginePills() {
- document.querySelectorAll('.engine-pills-wrap .engine-pill[data-engine]').forEach(el => {
- const e = el.dataset.engine;
- el.classList.remove('ep-active', 'ep-dimmed');
- if (activeEngines.size > 0) {
- if (activeEngines.has(e)) el.classList.add('ep-active');
- else el.classList.add('ep-dimmed');
- }
- });
- // also sync engine cards in engine-grid
- document.querySelectorAll('#engine-grid .suite-item[data-engine]').forEach(el => {
- el.classList.toggle('active', activeEngines.has(el.dataset.engine));
- });
- const btn = document.getElementById('clear-engines-btn');
- if (btn) btn.style.display = activeEngines.size > 0 ? '' : 'none';
-}
-
-function getDatasetFilteredRuns() {
- // Runs filtered only by dataset (not by engine) — used to keep all engine cards visible
- return allRuns.filter(r =>
- !hiddenEngines.has(r.engine) &&
- (activeDatasets.size === 0 || activeDatasets.has(r.dataset))
- );
-}
-
-function toggleEngine(engine) {
- if (activeEngines.has(engine)) {
- activeEngines.delete(engine);
- } else {
- activeEngines.add(engine);
- }
- const filtered = getFilteredRuns(allRuns);
- renderKPI(filtered);
- renderEngineCards(getDatasetFilteredRuns()); // toujours toutes les cartes
- syncEnginePills();
- updateCharts();
- updateTable();
- // Sync SPARQL section
- document.querySelectorAll('.query-engine-card[data-engine]').forEach(el => {
- const e = el.dataset.engine;
- el.style.display = (activeEngines.size === 0 || activeEngines.has(e)) ? '' : 'none';
- });
- updateQueryChart();
- updateQueryTable();
- pushStateToUrl();
-}
-
-function clearEngineFilter() {
- activeEngines.clear();
- const btn = document.getElementById('clear-engines-btn');
- if (btn) btn.style.display = 'none';
- renderEngineCards(getDatasetFilteredRuns());
- syncEnginePills();
- updateCharts();
- updateTable();
- pushStateToUrl();
-}
-
-function getFilteredRuns(runs) {
- return runs.filter(r =>
- !hiddenEngines.has(r.engine) &&
- (activeEngines.size === 0 || activeEngines.has(r.engine)) &&
- (activeDatasets.size === 0 || activeDatasets.has(r.dataset))
- );
-}
-
-function hidePillEngine(engine) {
- hiddenEngines.add(engine);
- activeEngines.delete(engine);
- // Remove pill from the comparator bar
- document.querySelectorAll(`.engine-pills-wrap .engine-pill[data-engine="${engine}"]`).forEach(el => el.remove());
- const filtered = getFilteredRuns(allRuns);
- renderKPI(filtered);
- renderEngineCards(getDatasetFilteredRuns());
- syncEnginePills();
- updateCharts();
- updateTable();
- document.querySelectorAll('.query-engine-card[data-engine]').forEach(el => {
- el.style.display = hiddenEngines.has(el.dataset.engine) ? 'none' : '';
- });
- updateQueryChart();
- updateQueryTable();
- updatePillsScrollBtns();
- pushStateToUrl();
-}
-
-function clearDatasetFilter() {
- activeDatasets.clear();
- syncDatasetPills();
- updateCharts();
- updateTable();
- renderKPI(getFilteredRuns(allRuns));
- renderEngineCards(getDatasetFilteredRuns());
- const btn = document.getElementById('clear-engines-btn');
- if (btn) btn.style.display = activeEngines.size > 0 ? '' : 'none';
- updateQuerySectionVisibility();
- pushStateToUrl();
-}
-
-function updateQuerySectionVisibility() {
- const sparqlSection = document.getElementById('section-sparql');
- const sparqlNav = document.getElementById('sidebar-sparql-nav');
- const hasSparql = activeDatasets.size > 0 &&
- [...activeDatasets].some(ds => DATASET_META[ds.toLowerCase()]?.hasSparql ?? false);
- if (sparqlSection) sparqlSection.style.display = hasSparql ? '' : 'none';
- if (sparqlNav) sparqlNav.style.display = hasSparql ? '' : 'none';
-}
-
-function renderDatasetPills(runs) {
- const wrap = document.getElementById('dataset-pills');
- if (!wrap) return;
- const datasets = [...new Set(runs.map(r => r.dataset))];
- wrap.innerHTML =
- `` +
- datasets.map(ds => {
- const meta = DATASET_META[ds.toLowerCase()] ?? { label: ds };
- const label = meta.label ?? ds;
- return ``;
- }).join('');
-}
-
-function syncDatasetPills() {
- document.querySelectorAll('.dataset-pill[data-ds]').forEach(el => {
- const ds = el.dataset.ds;
- el.classList.toggle('active', ds === '' ? activeDatasets.size === 0 : activeDatasets.has(ds));
- });
- // Dataset cards: show only selected one (or all in All mode)
- document.querySelectorAll('.dataset-card[data-ds]').forEach(el => {
- const ds = el.dataset.ds;
- el.classList.toggle('active', activeDatasets.has(ds));
- el.style.display = (activeDatasets.size === 0 || activeDatasets.has(ds)) ? '' : 'none';
- });
- _syncDatasetSections();
-}
-
-function _syncDatasetSections() {
- const isAll = activeDatasets.size === 0;
-
- // All mode: show Overview + Datasets + W3C, hide detail sections
- // Dataset selected: hide Overview + W3C, show detail sections
- const overviewSection = document.getElementById('section-kpi');
- if (overviewSection) overviewSection.style.display = isAll ? '' : 'none';
-
- const w3cSection = document.getElementById('section-w3c');
- if (w3cSection && w3cSection.innerHTML.trim()) w3cSection.style.display = isAll ? '' : 'none';
-
- const w3cNav = document.getElementById('sidebar-w3c-nav');
- if (w3cNav) w3cNav.style.display = isAll ? '' : 'none';
-
- // Bowlogna/BSBM are SPARQL-focused or single-file: hide Performance charts + Full results
- const isBowlogna = activeDatasets.has('bowlogna');
- const isBsbm = activeDatasets.has('bsbm');
- const isLubm = activeDatasets.has('lubm');
- const hideCharts = isAll || isBowlogna || isBsbm || isLubm;
- const hideResults = isAll || isBowlogna || isBsbm || isLubm;
-
- const enginesEl = document.getElementById('section-engines');
- if (enginesEl) enginesEl.style.display = isAll ? 'none' : '';
- const chartsEl = document.getElementById('section-charts');
- if (chartsEl) chartsEl.style.display = hideCharts ? 'none' : '';
- const resultsEl = document.getElementById('section-results');
- if (resultsEl) resultsEl.style.display = hideResults ? 'none' : '';
-
- // Sidebar: Overview nav visible in All, hidden in dataset mode
- document.querySelectorAll('.sidebar-nav-item[data-target="section-kpi"]').forEach(el => {
- el.closest('li').style.display = isAll ? '' : 'none';
- });
- document.querySelectorAll('.sidebar-nav-item[data-target="section-engines"]').forEach(el => {
- el.closest('li').style.display = isAll ? 'none' : '';
- });
- document.querySelectorAll('.sidebar-nav-item[data-target="section-charts"]').forEach(el => {
- el.closest('li').style.display = hideCharts ? 'none' : '';
- });
- document.querySelectorAll('.sidebar-nav-item[data-target="section-results"]').forEach(el => {
- el.closest('li').style.display = hideResults ? 'none' : '';
- });
- // Results group heading in sidebar
- const resultsGroup = document.querySelector('.sidebar-group:last-of-type');
- if (resultsGroup) resultsGroup.style.display = isAll ? 'none' : '';
-}
-
-function toggleDataset(ds) {
- if (activeDatasets.has(ds)) {
- activeDatasets.clear(); // re-clic → tout afficher
- } else {
- activeDatasets.clear();
- activeDatasets.add(ds); // sélection exclusive
- }
- syncDatasetPills();
- Object.values(allCharts).forEach(c => c.destroy());
- allCharts = {};
- updateTable();
- renderKPI(getFilteredRuns(allRuns));
- renderEngineCards(getDatasetFilteredRuns());
- _refreshQuerySection();
- pushStateToUrl();
- if (activeDatasets.size > 0) {
- requestAnimationFrame(() => requestAnimationFrame(() => {
- initCharts();
- _updateChartsMeta();
- }));
- }
-}
-
-function _updateChartsMeta() {
- const el = document.getElementById('charts-mode-meta');
- if (!el) return;
- el.textContent = isScalabilityMode()
- ? 'scalability view — X axis = graph size'
- : '';
-}
-
-function _refreshQuerySection() {
- // Always update visibility (hides SPARQL nav for datasets without SPARQL)
- updateQuerySectionVisibility();
- if (!_allQueryRunsGlobal || _allQueryRunsGlobal.length === 0) return;
- const hasSparql = activeDatasets.size > 0 &&
- [...activeDatasets].some(ds => DATASET_META[ds.toLowerCase()]?.hasSparql ?? false);
- const filteredQueryRuns = hasSparql
- ? _allQueryRunsGlobal.filter(r => activeDatasets.has(r.dataset))
- : [];
- const sparqlSection = document.getElementById('section-sparql');
- if (sparqlSection) sparqlSection.innerHTML = '';
- if (filteredQueryRuns.length > 0) {
- renderQuerySection(filteredQueryRuns);
- // Re-apply hidden engines (renderQuerySection re-renders from scratch)
- document.querySelectorAll('.query-engine-card[data-engine]').forEach(el => {
- el.style.display = hiddenEngines.has(el.dataset.engine) ? 'none' : '';
- });
- updateQueryChart();
- updateQueryTable();
- }
-}
-
-function setRefEngine(engine) {
- userRefEngine = userRefEngine === engine ? null : engine;
- if (userRefEngine) localStorage.setItem('refEngine', userRefEngine);
- else localStorage.removeItem('refEngine');
- renderEngineCards(getDatasetFilteredRuns());
- document.querySelectorAll('.suite-item[data-engine]').forEach(el => {
- el.classList.toggle('active', activeEngines.has(el.dataset.engine));
- });
- pushStateToUrl();
-}
-
-// ── Engine card drag & drop ───────────────────────────────────────────────────
-let dragSrc = null;
-let pillDragSrc = null;
-
-// ── Pill drag-to-reorder ──────────────────────────────────────────────────────
-function pillDragStart(e) {
- pillDragSrc = e.currentTarget;
- e.dataTransfer.effectAllowed = 'move';
- e.dataTransfer.setData('text/plain', pillDragSrc.dataset.engine);
- pillDragSrc.classList.add('pill-dragging');
-}
-
-function pillDragOver(e) {
- e.preventDefault();
- e.dataTransfer.dropEffect = 'move';
- const target = e.currentTarget;
- if (target !== pillDragSrc) target.classList.add('pill-drag-over');
-}
-
-function pillDragLeave(e) {
- e.currentTarget.classList.remove('pill-drag-over');
-}
-
-function pillDrop(e) {
- e.preventDefault();
- const target = e.currentTarget;
- target.classList.remove('pill-drag-over');
- if (!pillDragSrc || pillDragSrc === target) return;
- const wrap = document.getElementById('engine-pills');
- if (!wrap || !wrap.contains(pillDragSrc) || !wrap.contains(target)) return;
-
- const pills = [...wrap.querySelectorAll('.engine-pill[data-engine]')];
- const srcIdx = pills.indexOf(pillDragSrc);
- const tgtIdx = pills.indexOf(target);
-
- if (srcIdx < tgtIdx) wrap.insertBefore(pillDragSrc, target.nextSibling);
- else wrap.insertBefore(pillDragSrc, target);
-
- // Sync engine cards order to match pills
- const newOrder = [...wrap.querySelectorAll('.engine-pill[data-engine]')].map(el => el.dataset.engine);
- syncCardsToOrder(newOrder);
-}
-
-function pillDragEnd(e) {
- e.currentTarget.classList.remove('pill-dragging');
- document.querySelectorAll('.engine-pill').forEach(el => el.classList.remove('pill-drag-over'));
- pillDragSrc = null;
- updatePillsScrollBtns();
-}
-
-function syncCardsToOrder(order) {
- const grid = document.getElementById('engine-grid');
- if (!grid) return;
- order.forEach(engine => {
- const card = grid.querySelector(`.suite-item[data-engine="${engine}"]`);
- if (card) grid.appendChild(card);
- });
-}
-
-function syncPillsToOrder(order) {
- const wrap = document.getElementById('engine-pills');
- if (!wrap) return;
- order.forEach(engine => {
- const pill = wrap.querySelector(`.engine-pill[data-engine="${engine}"]`);
- if (pill) wrap.appendChild(pill);
- });
-}
-
-function attachPillDragHandlers(pill) {
- pill.addEventListener('dragstart', pillDragStart);
- pill.addEventListener('dragover', pillDragOver);
- pill.addEventListener('drop', pillDrop);
- pill.addEventListener('dragend', pillDragEnd);
- pill.addEventListener('dragleave', pillDragLeave);
-}
-
-function dragStart(e) {
- dragSrc = e.currentTarget;
- e.dataTransfer.effectAllowed = 'move';
- e.dataTransfer.setData('text/plain', dragSrc.dataset.engine);
- dragSrc.classList.add('dragging');
-}
-
-function dragOver(e) {
- e.preventDefault();
- e.dataTransfer.dropEffect = 'move';
- const target = e.currentTarget;
- if (target !== dragSrc) target.classList.add('drag-over');
-}
-
-function dragLeave(e) {
- e.currentTarget.classList.remove('drag-over');
-}
-
-function dragDrop(e) {
- e.preventDefault();
- const target = e.currentTarget;
- target.classList.remove('drag-over');
- if (!dragSrc || dragSrc === target) return;
-
- // Guard: source and target must be in the same grid
- const grid = document.getElementById('engine-grid');
- if (!grid.contains(dragSrc) || !grid.contains(target)) return;
-
- const items = [...grid.querySelectorAll('.suite-item[data-engine]')];
- const srcIdx = items.indexOf(dragSrc);
- const tgtIdx = items.indexOf(target);
-
- if (srcIdx < tgtIdx) grid.insertBefore(dragSrc, target.nextSibling);
- else grid.insertBefore(dragSrc, target);
-
- const order = [...grid.querySelectorAll('.suite-item[data-engine]')].map(el => el.dataset.engine);
- localStorage.setItem('engineOrder', JSON.stringify(order));
- syncPillsToOrder(order);
- updateCharts();
-}
-
-function dragQueryDrop(e) {
- e.preventDefault();
- const target = e.currentTarget;
- target.classList.remove('drag-over');
- if (!dragSrc || dragSrc === target) return;
-
- // Guard: source and target must be in the same grid
- const grid = document.getElementById('query-cards-grid');
- if (!grid || !grid.contains(dragSrc) || !grid.contains(target)) return;
-
- const items = [...grid.querySelectorAll('.query-engine-card[data-engine]')];
- const srcIdx = items.indexOf(dragSrc);
- const tgtIdx = items.indexOf(target);
-
- if (srcIdx < tgtIdx) grid.insertBefore(dragSrc, target.nextSibling);
- else grid.insertBefore(dragSrc, target);
- updateQueryChart();
-}
-
-function dragEnd(e) {
- e.currentTarget.classList.remove('dragging');
- document.querySelectorAll('.suite-item').forEach(el => el.classList.remove('drag-over'));
-}
-
-function applyStoredEngineOrder() {
- const stored = localStorage.getItem('engineOrder');
- if (!stored) return;
- try {
- const order = JSON.parse(stored);
- const grid = document.getElementById('engine-grid');
-
- // 1. Move engines that are in the stored order (skip unknowns)
- order.forEach(engine => {
- const el = grid.querySelector(`.suite-item[data-engine="${engine}"]`);
- if (el) grid.appendChild(el);
- });
-
- // 2. Append engines NOT in stored order at the end (new engines from a different run)
- grid.querySelectorAll('.suite-item[data-engine]').forEach(el => {
- if (!order.includes(el.dataset.engine)) grid.appendChild(el);
- });
- } catch (_) {}
-}
-
-// ── Charts ────────────────────────────────────────────────────────────────────
-let allRuns = [];
-let currentData = null;
-
-const CHART_OPT = (yLabel) => ({
- responsive: true,
- maintainAspectRatio: false,
- plugins: {
- legend: { position: 'bottom', labels: { boxWidth: 10, padding: 12, font: { size: 11, family: "'Inter'" } } },
- tooltip: { mode: 'index', intersect: false },
- },
- scales: {
- x: { grid: { display: false }, ticks: { font: { size: 10 }, maxRotation: 20 } },
- y: {
- grid: { color: 'rgba(255,255,255,0.05)' },
- ticks: { font: { size: 10 } },
- beginAtZero: true,
- title: { display: true, text: yLabel, font: { size: 10 }, color: '#8b949e' },
- },
- },
-});
-
-// ── Scalability mode (single dataset → line charts by triple count) ───────────
-// Active when exactly one non-bowlogna dataset is selected.
-function isScalabilityMode() {
- return activeDatasets.size === 1 && !activeDatasets.has('bowlogna');
-}
-
-function fmtTriples(n) {
- if (n >= 1_000_000) return (n / 1_000_000).toFixed(1).replace(/\.0$/, '') + 'M';
- if (n >= 1_000) return Math.round(n / 1_000) + 'K';
- return String(n);
-}
-
-// Returns files sorted by ascending average triple count across engines
-function getScalabilityFiles() {
- const dsRuns = allRuns.filter(r => activeDatasets.has(r.dataset));
- const files = [...new Set(dsRuns.map(r => r.file))];
- files.sort((a, b) => {
- const avg = f => {
- const rs = dsRuns.filter(r => r.file === f);
- return rs.length ? rs.reduce((s, r) => s + r.triples, 0) / rs.length : 0;
- };
- return avg(a) - avg(b);
- });
- return files;
-}
-
-// X-axis labels: triple count formatted (e.g. "4M", "800K")
-function getScalabilityLabels(files) {
- const dsRuns = allRuns.filter(r => activeDatasets.has(r.dataset));
- return files.map(f => {
- const rs = dsRuns.filter(r => r.file === f);
- const avg = rs.length ? rs.reduce((s, r) => s + r.triples, 0) / rs.length : 0;
- return fmtTriples(Math.round(avg));
- });
-}
-
-const LINE_CHART_OPT = (yLabel, fileNames = []) => ({
- responsive: true,
- maintainAspectRatio: false,
- spanGaps: true,
- plugins: {
- legend: { position: 'bottom', labels: { boxWidth: 10, padding: 12, font: { size: 11, family: "'Inter'" } } },
- tooltip: {
- mode: 'index',
- intersect: false,
- callbacks: {
- title: (items) => {
- const idx = items[0]?.dataIndex ?? 0;
- const fname = fileNames[idx] ? shortFile(fileNames[idx]) : '';
- return fname ? `${items[0].label} — ${fname}` : items[0].label;
- },
- },
- },
- },
- scales: {
- x: {
- grid: { display: false },
- ticks: { font: { size: 10 }, maxRotation: 20 },
- title: { display: true, text: 'Graph size (triples)', font: { size: 10 }, color: '#8b949e' },
- },
- y: {
- grid: { color: 'rgba(255,255,255,0.05)' },
- ticks: { font: { size: 10 } },
- beginAtZero: true,
- title: { display: true, text: yLabel, font: { size: 10 }, color: '#8b949e' },
- },
- },
-});
-
-function buildLineDatasets(field) {
- const dsRuns = allRuns.filter(r => activeDatasets.has(r.dataset));
- const allEngs = getEngineOrder();
- const engines = allEngs.filter(e =>
- !hiddenEngines.has(e) && (activeEngines.size === 0 || activeEngines.has(e))
- );
- const files = getScalabilityFiles();
- return engines.map(engine => {
- const p = pal(engine);
- return {
- label: engine,
- data: files.map(f => {
- const r = dsRuns.find(x => x.engine === engine && x.file === f);
- return r ? +r[field].toFixed(1) : null;
- }),
- borderColor: p.hex,
- backgroundColor: p.bg,
- borderWidth: 2,
- tension: 0.3,
- pointRadius: 4,
- pointHoverRadius: 6,
- fill: false,
- };
- });
-}
-
-function buildDatasets(field) {
- const dsRuns = activeDatasets.size === 0 ? allRuns : allRuns.filter(r => activeDatasets.has(r.dataset));
- const allEngs = getEngineOrder();
- // Respect activeEngines filter (empty = all)
- const engines = allEngs.filter(e =>
- !hiddenEngines.has(e) && (activeEngines.size === 0 || activeEngines.has(e))
- );
- const files = [...new Set(dsRuns.map(r => r.file))];
- return engines.map(engine => {
- const p = pal(engine);
- return {
- label: engine,
- data: files.map(f => {
- const r = dsRuns.find(x => x.engine === engine && x.file === f);
- return r ? +r[field].toFixed(1) : null;
- }),
- backgroundColor: p.bg,
- borderColor: p.hex,
- borderWidth: 1,
- borderRadius: 3,
- };
- });
-}
-
-function getEngineOrder() {
- const cardEls = document.querySelectorAll('#engine-grid .suite-item[data-engine]');
- return cardEls.length > 0
- ? [...cardEls].map(el => el.dataset.engine)
- : [...new Set(allRuns.map(r => r.engine))];
-}
-
-function buildCombinedDatasets() {
- const dsRuns = activeDatasets.size === 0 ? allRuns : allRuns.filter(r => activeDatasets.has(r.dataset));
- const allEngines = getEngineOrder();
- const engines = activeEngines.size === 0 ? allEngines : allEngines.filter(e => activeEngines.has(e));
- const files = [...new Set(dsRuns.map(r => r.file))];
- const datasets = [];
- engines.forEach(engine => {
- const p = pal(engine);
- // Barres : Loading time (axe gauche)
- datasets.push({
- label: `${engine}`,
- type: 'bar',
- yAxisID: 'yLeft',
- data: files.map(f => { const r = dsRuns.find(x => x.engine === engine && x.file === f); return r ? +r.loadingTimeMs.toFixed(0) : null; }),
- backgroundColor: p.bg,
- borderColor: p.hex,
- borderWidth: 1,
- borderRadius: 3,
- });
- // Lignes : Memory (axe droit)
- datasets.push({
- label: `${engine} (MB)`,
- type: 'line',
- yAxisID: 'yRight',
- data: files.map(f => { const r = dsRuns.find(x => x.engine === engine && x.file === f); return r ? +r.memoryDeltaMb.toFixed(1) : null; }),
- borderColor: p.hex,
- backgroundColor: 'transparent',
- borderWidth: 2,
- borderDash: [5, 3],
- pointRadius: 3,
- tension: 0.3,
- });
- });
- return datasets;
-}
-
-function initCharts() {
- const defs = [
- { id: 'chart-loading', field: 'loadingTimeMs', unit: 'ms' },
- { id: 'chart-memory', field: 'memoryDeltaMb', unit: 'MB' },
- { id: 'chart-cpu', field: 'cpuPercent', unit: '%' },
- ];
-
- if (isScalabilityMode()) {
- // Single dataset → line charts (X = triple count, ascending)
- const files = getScalabilityFiles();
- const labels = getScalabilityLabels(files);
- for (const { id, field, unit } of defs) {
- allCharts[id] = new Chart(document.getElementById(id).getContext('2d'), {
- type: 'line',
- data: { labels, datasets: buildLineDatasets(field) },
- options: LINE_CHART_OPT(unit, files),
- });
- allCharts[id]._field = field;
- }
- } else {
- // All / multi-dataset → bar charts
- const dsRuns = activeDatasets.size === 0 ? allRuns : allRuns.filter(r => activeDatasets.has(r.dataset));
- const files = [...new Set(dsRuns.map(r => r.file))];
- const labels = files.map(shortFile);
- for (const { id, field, unit } of defs) {
- allCharts[id] = new Chart(document.getElementById(id).getContext('2d'), {
- type: 'bar',
- data: { labels, datasets: buildDatasets(field) },
- options: CHART_OPT(unit),
- });
- allCharts[id]._field = field;
- }
- }
-}
-
-function updateCharts() {
- if (activeDatasets.size === 0) return;
- if (Object.keys(allCharts).length === 0) return; // charts not yet created
-
- if (isScalabilityMode()) {
- // Line mode: update labels + datasets in-place
- const files = getScalabilityFiles();
- const labels = getScalabilityLabels(files);
- for (const chart of Object.values(allCharts)) {
- const field = chart._field;
- if (!field) continue;
- chart.data.labels = labels;
- const newDs = buildLineDatasets(field);
- chart.data.datasets.splice(0, chart.data.datasets.length, ...newDs);
- chart.update('none');
- }
- } else {
- // Bar mode: update datasets in-place
- const dsRuns = allRuns.filter(r => activeDatasets.has(r.dataset));
- const allEngs = getEngineOrder();
- const engines = allEngs.filter(e =>
- !hiddenEngines.has(e) && (activeEngines.size === 0 || activeEngines.has(e))
- );
- const files = [...new Set(dsRuns.map(r => r.file))];
-
- for (const chart of Object.values(allCharts)) {
- const field = chart._field;
- if (!field) continue;
- const newDs = engines.map(engine => {
- const p = pal(engine);
- return {
- label: engine,
- data: files.map(f => {
- const r = dsRuns.find(x => x.engine === engine && x.file === f);
- return r ? +r[field].toFixed(1) : null;
- }),
- backgroundColor: p.bg,
- borderColor: p.hex,
- borderWidth: 1,
- borderRadius: 3,
- };
- });
- chart.data.datasets.splice(0, chart.data.datasets.length, ...newDs);
- chart.update('none');
- }
- }
-
- const filtered = getFilteredRuns(allRuns);
- if (filtered.length > 0) renderKPI(filtered);
-}
-
-// ── Tableau ────────────────────────────────────────────────────────────────────
-function renderTable(runs) {
- updateTable(runs);
-}
-
-function updateTable(runsArg) {
- let runs = getFilteredRuns(runsArg ?? allRuns);
-
- if (sortField) {
- runs = [...runs].sort((a, b) => {
- const av = a[sortField], bv = b[sortField];
- if (typeof av === 'string') return sortAsc ? av.localeCompare(bv) : bv.localeCompare(av);
- return sortAsc ? av - bv : bv - av;
- });
- }
-
- const tbody = document.getElementById('results-body');
- const thead = tbody.closest('table').querySelector('thead tr');
- tbody.innerHTML = '';
-
- // 2-engine diff mode: when exactly 2 engines are selected
- const diffMode = activeEngines.size === 2;
- const [engA, engB] = diffMode ? [...activeEngines] : [null, null];
-
- // Update thead diff column
- const existingDiff = thead.querySelector('th.diff-col');
- if (existingDiff) existingDiff.remove();
- if (diffMode) {
- const th = document.createElement('th');
- th.className = 'text-right diff-col';
- th.title = `${engA} vs ${engB}`;
- th.textContent = 'Δ throughput';
- thead.insertBefore(th, thead.lastElementChild);
- }
-
- // Group by file for diff calculation
- const files = [...new Set(runs.map(r => r.file))];
- const grouped = {};
- if (diffMode) {
- files.forEach(f => {
- grouped[f] = {};
- runs.filter(r => r.file === f).forEach(r => { grouped[f][r.engine] = r; });
- });
- }
-
- for (const r of runs) {
- const tr = document.createElement('tr');
- let diffCell = '';
- if (diffMode) {
- const peer = grouped[r.file]?.[r.engine === engA ? engB : engA];
- if (peer) {
- const peerThru = peer.throughputTriplesPerSec;
- const delta = peerThru > 0
- ? ((r.throughputTriplesPerSec - peerThru) / peerThru * 100).toFixed(1)
- : null;
- const cls = delta == null ? '' : delta > 0 ? 'diff-better' : delta < 0 ? 'diff-worse' : '';
- diffCell = delta == null
- ? `— | `
- : `${delta > 0 ? '+' : ''}${delta}% | `;
- } else {
- diffCell = `— | `;
- }
- }
- tr.innerHTML = `
- ${r.engine} |
- ${shortFile(r.file)} |
- ${fmt(r.triples)} |
- ${fmt(r.loadingTimeMs)} |
- ${fmt(r.throughputTriplesPerSec, 0)} |
- ${fmt(r.memoryDeltaMb, 1)} |
- ${fmt(r.cpuPercent, 1)} |
- ${diffMode ? diffCell : ''}
- ${r.repetitionsMs.join(' · ')} |
- `;
- tbody.appendChild(tr);
- }
-}
-
-// ── Query benchmark section ───────────────────────────────────────────────────
-let activeQueryEngines = new Set();
-let queryChart = null;
-let allQueryRuns = []; // filtered to active dataset (used by charts/table)
-let _allQueryRunsGlobal = []; // full set from JSON (never overwritten)
-let queryChartDatasetsBase = {}; // datasets originaux, jamais modifiés
-let queryTtfrDatasetsBase = {};
-let activeQueryTypeFilter = 'all'; // 'all' | 'GRAPH_PATTERN' | 'TEMPORAL' | 'GROUP_BY' | 'SUBQUERY'
-
-function toggleQueryEngine(engine) {
- if (activeQueryEngines.has(engine)) {
- activeQueryEngines.delete(engine);
- } else {
- activeQueryEngines.add(engine);
- }
- document.querySelectorAll('.query-engine-card[data-engine]').forEach(el => {
- el.classList.toggle('active', activeQueryEngines.has(el.dataset.engine));
- });
- const btn = document.getElementById('clear-query-engines-btn');
- if (btn) btn.style.display = activeQueryEngines.size > 0 ? '' : 'none';
- updateQueryChart();
- updateQueryTable();
-}
-
-function setQueryTypeFilter(type) {
- activeQueryTypeFilter = type;
- document.querySelectorAll('.query-type-pill').forEach(btn => {
- btn.classList.toggle('active', btn.dataset.type === type);
- });
- updateQueryChart();
- updateQueryTable();
-}
-
-function _syncQueryTypePills() {
- const present = new Set(allQueryRuns.map(r => r.queryCategory ?? 'GRAPH_PATTERN'));
- // Hide the entire filter bar if all queries have the same category (no useful filtering)
- const filterBar = document.getElementById('query-type-filter-bar');
- if (filterBar) filterBar.style.display = present.size <= 1 ? 'none' : '';
- document.querySelectorAll('.query-type-pill[data-type]').forEach(btn => {
- const t = btn.dataset.type;
- btn.style.display = (t === 'all' || present.has(t)) ? '' : 'none';
- });
-}
-
-function clearQueryEngineFilter() {
- activeQueryEngines.clear();
- document.querySelectorAll('.query-engine-card[data-engine]').forEach(el => el.classList.remove('active'));
- const btn = document.getElementById('clear-query-engines-btn');
- if (btn) btn.style.display = 'none';
- updateQueryChart();
- updateQueryTable();
-}
-
-function _classifySparql(sparql) {
- if (!sparql) return 'GRAPH_PATTERN';
- // Strip comments and string literals, then uppercase
- const cleaned = sparql.replace(/#[^\n]*/g, '').replace(/"[^"]*"|'[^']*'/g, '""').toUpperCase();
- if (/\{[^{}]*\bSELECT\b/.test(cleaned)) return 'SUBQUERY';
- if (/\bGROUP\s+BY\b/.test(cleaned)) return 'GROUP_BY';
- if (/\bNOW\s*\(|\bXSD:DATETIME\b|\bXSD:DATE\b|\b(DAY|MONTH|YEAR|HOURS|MINUTES|SECONDS)\s*\(/.test(cleaned)) return 'TEMPORAL';
- return 'GRAPH_PATTERN';
-}
-
-function _visibleQueryIds() {
- return [...new Set(allQueryRuns
- .filter(r => activeQueryTypeFilter === 'all' || (r.queryCategory ?? 'GRAPH_PATTERN') === activeQueryTypeFilter)
- .map(r => r.queryId)
- )].sort((a, b) => parseInt(a.split('_')[1]) - parseInt(b.split('_')[1]));
-}
-
-function _visibleQueryEngines() {
- const cardOrder = [...document.querySelectorAll('.query-engine-card[data-engine]')]
- .map(el => el.dataset.engine);
- return cardOrder.filter(e =>
- !hiddenEngines.has(e) &&
- (activeQueryEngines.size === 0 || activeQueryEngines.has(e)) &&
- (activeEngines.size === 0 || activeEngines.has(e))
- );
-}
-
-function updateQueryChart() {
- const qids = _visibleQueryIds();
- const engines = _visibleQueryEngines();
-
- if (queryChart) {
- const isTtfr = _activeQueryChartMode === 'ttfr';
- const base = isTtfr ? queryTtfrDatasetsBase : queryChartDatasetsBase;
- queryChart.data.labels = qids;
- queryChart.data.datasets = engines
- .filter(e => base[e])
- .map(e => {
- const p = pal(e);
- return { ...base[e],
- data: qids.map(qid => {
- const r = allQueryRuns.find(r => r.engine === e && r.queryId === qid);
- if (isTtfr) return r && r.medianTtfrMs != null && r.medianTtfrMs >= 0 ? r.medianTtfrMs : null;
- return r && r.medianMs >= 0 ? r.medianMs : null;
- }),
- backgroundColor: p.bg, borderColor: p.hex,
- };
- });
- queryChart.update();
- }
-}
-
-function updateQueryTable() {
- const tbody = document.getElementById('query-results-body');
- if (!tbody || !allQueryRuns.length) return;
- const table = tbody.closest('table');
- if (!table) return;
-
- const allEngines = [...new Set(allQueryRuns.map(r => r.engine))];
- const visibleEngines = allEngines.filter(e =>
- !hiddenEngines.has(e) &&
- (activeQueryEngines.size === 0 || activeQueryEngines.has(e)) &&
- (activeEngines.size === 0 || activeEngines.has(e))
- );
-
- const queryIds = _visibleQueryIds();
-
- // Masquer les colonnes non visibles dans le thead
- table.querySelectorAll('thead th[data-engine]').forEach(th => {
- th.style.display = visibleEngines.includes(th.dataset.engine) ? '' : 'none';
- });
-
- // Reconstruire le tbody avec best recalculé parmi les moteurs visibles uniquement
- tbody.innerHTML = queryIds.map(qid => {
- // Valeurs pour tous les moteurs (pour mapping colonne)
- const rowData = allEngines.map(engine => {
- const r = allQueryRuns.find(r => r.engine === engine && r.queryId === qid);
- return r && r.medianMs >= 0 ? r.medianMs : null;
- });
-
- // Best parmi moteurs VISIBLES seulement
- const visibleData = visibleEngines.map(e => rowData[allEngines.indexOf(e)]);
- const validVisible = visibleData.filter(v => v !== null);
- const minMs = validVisible.length ? Math.min(...validVisible) : null;
- const winner = minMs !== null ? visibleEngines[visibleData.indexOf(minMs)] : null;
-
- const cells = allEngines.map((engine, i) => {
- if (!visibleEngines.includes(engine)) return ` | `;
- const ms = rowData[i];
- if (ms === null) return `— | `;
- return `${fmt(ms)} ms | `;
- }).join('');
-
- const bestCell = winner
- ? `${winner} | `
- : `— | `;
-
- return `| ${qid} | ${cells}${bestCell}
`;
- }).join('');
-}
-
-function renderQuerySection(queryRuns) {
- if (!queryRuns || queryRuns.length === 0) return;
- allQueryRuns = queryRuns;
-
- const engines = [...new Set(queryRuns.map(r => r.engine))];
- const queryIds = [...new Set(queryRuns.map(r => r.queryId))].sort(
- (a, b) => parseInt(a.split('_')[1]) - parseInt(b.split('_')[1])
- );
-
- // Summary cards per engine — draggable + clickable
- const cards = engines.map(engine => {
- const eruns = queryRuns.filter(r => r.engine === engine && r.medianMs >= 0);
- const avgMs = eruns.length ? eruns.reduce((s, r) => s + r.medianMs, 0) / eruns.length : 0;
- const sorted = eruns.map(r => r.medianMs).sort((a,b)=>a-b);
- const p50 = sorted.length ? sorted[Math.floor(sorted.length * 0.50)] : 0;
- const p95 = sorted.length ? sorted[Math.floor(sorted.length * 0.95)] : 0;
- const p99 = sorted.length ? sorted[Math.floor(sorted.length * 0.99)] : 0;
- const p = pal(engine);
- return `
- `;
- }).join('');
-
- // Bar chart data
- const datasets = engines.map(engine => {
- const p = pal(engine);
- return {
- label: engine,
- data: queryIds.map(qid => {
- const r = queryRuns.find(r => r.engine === engine && r.queryId === qid);
- return r && r.medianMs >= 0 ? r.medianMs : null;
- }),
- backgroundColor: p.bg,
- borderColor: p.hex,
- borderWidth: 1,
- };
- });
-
- const section = document.createElement('section');
- section.className = 'query-section';
- section.innerHTML = `
-
-
- SPARQL Queries
- ${queryIds.length} queries · ${engines.length} engines · ms, lower is better
-
-
-
-
-
-
-
Median execution time per query — 3 repetitions · — = timeout or error
-
-
- ${cards}
-
- Query type:
-
-
-
-
-
-
-
-
-
-
-
-
-
- `;
- const sparqlSection = document.getElementById('section-sparql');
- if (sparqlSection) {
- // Show only if a specific dataset is selected (not in All mode)
- sparqlSection.style.display = activeDatasets.size > 0 ? '' : 'none';
- sparqlSection.appendChild(section);
- } else {
- (document.querySelector('.app-content') || document.querySelector('.app-wrapper')).appendChild(section);
- }
-
- // Stocker les datasets originaux pour pouvoir restaurer après filtre
- queryChartDatasetsBase = {};
- datasets.forEach(ds => { queryChartDatasetsBase[ds.label] = ds; });
-
- // Reset query type filter on re-render
- activeQueryTypeFilter = 'all';
- // Sync pills visibility after DOM is ready
- requestAnimationFrame(() => _syncQueryTypePills());
-
- const chartOpts = {
- responsive: true,
- plugins: {
- legend: { position: 'bottom', labels: { boxWidth: 10, padding: 12, font: { size: 11, family: "'Inter'" } } },
- tooltip: { callbacks: { label: ctx => ` ${ctx.dataset.label}: ${fmt(ctx.raw, 0)} ms` } },
- },
- scales: {
- x: { grid: { display: false }, ticks: { font: { size: 10 } } },
- y: { beginAtZero: true, ticks: { callback: v => fmt(v, 0) + ' ms' } },
- },
- };
-
- // Render main execution time chart
- queryChart = new Chart(document.getElementById('chart-queries'), {
- type: 'bar',
- data: { labels: queryIds, datasets },
- options: chartOpts,
- });
-
- // Store TTFR datasets for toggle
- queryTtfrDatasetsBase = {};
- engines.forEach(engine => {
- const p = pal(engine);
- queryTtfrDatasetsBase[engine] = {
- label: engine,
- data: queryIds.map(qid => {
- const r = queryRuns.find(r => r.engine === engine && r.queryId === qid);
- return r && r.medianTtfrMs != null && r.medianTtfrMs >= 0 ? r.medianTtfrMs : null;
- }),
- backgroundColor: p.bg,
- borderColor: p.hex,
- borderWidth: 1,
- };
- });
-
- const hasTtfr = queryRuns.some(r => r.medianTtfrMs != null && r.medianTtfrMs >= 0);
- const toggle = document.getElementById('query-chart-toggle');
- if (toggle) toggle.style.display = hasTtfr ? 'flex' : 'none';
- _activeQueryChartMode = 'exec';
-
-}
-
-let _activeQueryChartMode = 'exec';
-
-function setQueryChartMode(mode) {
- _activeQueryChartMode = mode;
- document.getElementById('toggle-exec')?.classList.toggle('active', mode === 'exec');
- document.getElementById('toggle-ttfr')?.classList.toggle('active', mode === 'ttfr');
- const title = document.getElementById('query-chart-title');
- if (title) title.textContent = mode === 'ttfr' ? 'Time to First Result (TTFR)' : 'Time per query';
- updateQueryChart();
-}
-
-
-// ── Chart zoom modal ──────────────────────────────────────────────────────────
-let _zoomChart = null;
-
-function openChartZoom(chartId) {
- const src = allCharts[chartId];
- if (!src) return;
-
- const dialog = document.getElementById('chart-zoom-modal');
- const titleEl = document.getElementById('chart-zoom-title');
- const pngBtn = document.getElementById('chart-zoom-png');
- const canvas = document.getElementById('chart-zoom-canvas');
-
- // Titre = titre du chart-surface correspondant
- const surface = document.getElementById(chartId)?.closest('.chart-surface');
- titleEl.textContent = surface?.querySelector('.chart-title')?.textContent ?? chartId;
-
- // Détruire le chart zoom précédent
- if (_zoomChart) { _zoomChart.destroy(); _zoomChart = null; }
-
- // Cloner data + options du chart source
- _zoomChart = new Chart(canvas.getContext('2d'), {
- type: src.config.type,
- data: JSON.parse(JSON.stringify(src.data)),
- options: {
- ...src.config.options,
- responsive: true,
- maintainAspectRatio: false,
- plugins: {
- ...src.config.options?.plugins,
- legend: { position: 'bottom', labels: { boxWidth: 12, padding: 16, font: { size: 13, family: "'Inter'" } } },
- },
- },
- });
-
- pngBtn.onclick = () => {
- const a = document.createElement('a');
- a.download = `corese-benchmark-${chartId}.png`;
- a.href = canvas.toDataURL('image/png');
- a.click();
- };
-
- dialog.showModal();
-}
-
-function closeChartZoom() {
- const dialog = document.getElementById('chart-zoom-modal');
- dialog.close();
- if (_zoomChart) { _zoomChart.destroy(); _zoomChart = null; }
-}
-
-// ── PNG export ────────────────────────────────────────────────────────────────
-function downloadChart(canvasId, name) {
- const canvas = document.getElementById(canvasId);
- if (!canvas) return;
- const a = document.createElement('a');
- a.download = `corese-benchmark-${name}.png`;
- a.href = canvas.toDataURL('image/png');
- a.click();
-}
-
-// ── Pills scroll arrows ───────────────────────────────────────────────────────
-function scrollPills(dir) {
- const wrap = document.getElementById('engine-pills');
- if (!wrap) return;
- wrap.scrollBy({ left: dir * 180, behavior: 'smooth' });
-}
-
-function updatePillsScrollBtns() {
- const wrap = document.getElementById('engine-pills');
- const btnL = document.getElementById('pills-scroll-left');
- const btnR = document.getElementById('pills-scroll-right');
- if (!wrap || !btnL || !btnR) return;
- const canScrollL = wrap.scrollLeft > 4;
- const canScrollR = wrap.scrollLeft < wrap.scrollWidth - wrap.clientWidth - 4;
- btnL.style.opacity = canScrollL ? '1' : '0.25';
- btnL.style.pointerEvents = canScrollL ? '' : 'none';
- btnR.style.opacity = canScrollR ? '1' : '0.25';
- btnR.style.pointerEvents = canScrollR ? '' : 'none';
- // hide both if no overflow
- const hasOverflow = wrap.scrollWidth > wrap.clientWidth + 4;
- btnL.style.display = hasOverflow ? '' : 'none';
- btnR.style.display = hasOverflow ? '' : 'none';
-}
-
-// ── Sidebar scroll-spy ────────────────────────────────────────────────────────
-function initSidebar() {
- // Click → smooth scroll
- document.querySelectorAll('.sidebar-nav-item[data-target]').forEach(item => {
- item.addEventListener('click', e => {
- e.preventDefault();
- const target = document.getElementById(item.dataset.target);
- if (target) target.scrollIntoView({ behavior: 'smooth', block: 'start' });
- });
- });
-
- // Search filter
- document.getElementById('sidebar-search-input')?.addEventListener('input', e => {
- const q = e.target.value.toLowerCase();
- document.querySelectorAll('.sidebar-nav-item').forEach(item => {
- const text = item.textContent.toLowerCase();
- item.closest('li').style.display = text.includes(q) ? '' : 'none';
- });
- });
-
- // Scroll-spy via IntersectionObserver
- const sections = document.querySelectorAll('.page-section[id]');
- const navItems = document.querySelectorAll('.sidebar-nav-item[data-target]');
- const observer = new IntersectionObserver(entries => {
- entries.forEach(entry => {
- if (entry.isIntersecting) {
- navItems.forEach(item => item.classList.remove('active'));
- const active = document.querySelector(`.sidebar-nav-item[data-target="${entry.target.id}"]`);
- if (active) active.classList.add('active');
- }
- });
- }, { rootMargin: '-20% 0px -70% 0px', threshold: 0 });
- sections.forEach(s => observer.observe(s));
-}
-
-// ── Add engine modal ──────────────────────────────────────────────────────────
-// Famille → préfixe avant le premier "."
-function _engineFamily(e) { const d = e.indexOf('.'); return d >= 0 ? e.slice(0, d) : e; }
-
-function _populateVersionSelect(family, subset) {
- const engines = subset ?? [...new Set(allRuns.map(r => r.engine))];
- const versions = engines
- .filter(e => _engineFamily(e) === family)
- .map(e => { const d = e.indexOf('.'); return d >= 0 ? e.slice(d + 1) : e; });
- const sel = document.getElementById('modal-select-version');
- if (!sel) return;
- sel.innerHTML = versions.map(v => `${v}`).join('');
-}
-
-function openAddEngineModal() {
- const overlay = document.getElementById('modal-add-engine');
- if (!overlay) return;
-
- // Familles disponibles dans les données (uniquement moteurs cachés)
- const allEngines = [...new Set(allRuns.map(r => r.engine))];
- const available = hiddenEngines.size > 0
- ? allEngines.filter(e => hiddenEngines.has(e))
- : allEngines;
- const families = [...new Set(available.map(_engineFamily))];
-
- const triplesel = document.getElementById('modal-select-triplestore');
- if (triplesel) {
- const labels = { corese: 'Corese', jena: 'Apache Jena', rdf4j: 'Eclipse RDF4J' };
- triplesel.innerHTML = families.map(f =>
- `${labels[f] ?? f}`
- ).join('');
- _populateVersionSelect(triplesel.value, available);
- triplesel.onchange = () => _populateVersionSelect(triplesel.value, available);
- }
-
- overlay.classList.add('active');
- overlay.addEventListener('click', e => { if (e.target === overlay) closeAddEngineModal(); }, { once: true });
-}
-
-function closeAddEngineModal() {
- document.getElementById('modal-add-engine')?.classList.remove('active');
-}
-
-// ── W3C Conformance ───────────────────────────────────────────────────────────
-function w3cShowTab(tab) {
- document.getElementById('w3c-tab-failed').style.display = tab === 'failed' ? '' : 'none';
- const ct = document.getElementById('w3c-tab-cannot');
- if (ct) ct.style.display = tab === 'cannot' ? '' : 'none';
- ['failed','cannot'].forEach(t => document.getElementById('w3c-pill-' + t)?.classList.toggle('active', t === tab));
-}
-
-async function loadW3CData() {
- try {
- const res = await fetch('https://corese-stack.github.io/corese-w3c/data/w3c-report.json');
- if (!res.ok) throw new Error(res.statusText);
- return await res.json();
- } catch (e) {
- console.warn('W3C data unavailable:', e);
- return null;
- }
-}
-
-function renderW3CSection(data) {
- const section = document.getElementById('section-w3c');
- if (!section) return;
-
- if (!data) {
- section.innerHTML = `W3C Conformance
- Data unavailable — check your connection.
`;
- section.style.display = '';
- return;
- }
-
- const { metadata, summary, suites } = data;
- const engineVersion = metadata?.coreseVersion ?? metadata?.version ?? '—';
- const runDate = metadata?.date ?? metadata?.generatedAt ?? null;
-
- // ── Summary cards ──
- const pct = summary.passRate?.toFixed(2) ?? '—';
- const exePct = summary.executedPassRate?.toFixed(2) ?? null;
-
- const summaryCards = [
- { label: 'Pass rate', value: `${pct}%`, sub: exePct ? `${exePct}% executed` : '', cls: 'w3c-card-pass' },
- { label: 'Passed', value: fmt(summary.passed), sub: `/ ${fmt(summary.total)} tests`, cls: '' },
- { label: 'Failed', value: fmt(summary.failed), sub: 'tests failed', cls: summary.failed > 0 ? 'w3c-card-fail' : '' },
- { label: 'Inapplicable', value: fmt(summary.inapplicable ?? summary.skipped ?? 0), sub: 'inapplicable / skipped', cls: '' },
- { label: 'Cannot tell', value: fmt(summary.cantTell ?? 0), sub: 'uncertain', cls: '' },
- ].map(c => `
-
-
${c.label}
-
${c.value}
- ${c.sub ? `
${c.sub}
` : ''}
-
`).join('');
-
- // ── Pass rate bar ──
- const barPct = Math.min(parseFloat(pct), 100);
- const barColor = barPct >= 99 ? '#3fb950' : barPct >= 95 ? '#d29922' : '#f85149';
- const passBar = `
- `;
-
- // ── Suite table ──
- const suiteRows = suites.map(s => {
- const suitePct = s.total > 0 ? (s.passed / s.total * 100).toFixed(1) : '—';
- const failCls = s.failed > 0 ? 'w3c-fail-cell' : '';
- return `
- | ${s.name ?? s.id} |
- ${s.specification ?? s.component ?? '—'} |
- ${fmt(s.total)} |
- ${fmt(s.passed)} |
- ${fmt(s.failed)} |
- ${s.inapplicable ?? 0} |
- ${suitePct}% |
-
`;
- }).join('');
-
- // ── Failed + Cannot tell detail ──
- const cantTellTests = suites.flatMap(s =>
- (s.tests ?? [])
- .filter(t => ['CANT_TELL', 'CANNOT_TELL', 'cantTell'].includes(t.outcome ?? ''))
- .map(t => ({ suite: s.name ?? s.id, ...t }))
- );
- const cantTellNames = new Set(cantTellTests.map(t => t.name ?? t.testUri));
- const failedTests = suites.flatMap(s =>
- (s.tests ?? [])
- .filter(t => (t.status ?? t.outcome) === 'FAILED' && !cantTellNames.has(t.name ?? t.testUri))
- .map(t => ({ suite: s.name ?? s.id, ...t }))
- );
- const nCantTell = cantTellTests.length || (summary.cantTell ?? 0);
- const totalNonPassing = failedTests.length + nCantTell;
-
- const failedHtml = totalNonPassing === 0 ? '' : `
-
-
- ${failedTests.length} failed
- ${nCantTell > 0 ? `· ${nCantTell} cannot tell` : ''}
-
-
-
- ${nCantTell > 0 ? `` : ''}
-
-
- ${nCantTell > 0 ? `
- ` : ''}
- `;
-
- section.innerHTML = `
-
-
W3C Conformance
-
- Corese only · v${engineVersion}${runDate ? ' · ' + formatDate(runDate) : ''}
- ·
- corese-w3c ↗
-
-
- ${passBar}
- ${summaryCards}
-
-
- Results by suite
- ${suites.length} suites
-
-
-
- ${failedHtml}
- `;
-
- section.style.display = '';
- const nav = document.getElementById('sidebar-w3c-nav');
- if (nav) {
- nav.style.display = '';
- const badge = document.getElementById('sidebar-badge-w3c');
- if (badge) badge.textContent = `${pct}%`;
- }
-}
-
-// ── Main ─────────────────────────────────────────────────────────────────────
-async function main() {
- let data;
- try {
- data = await loadData();
- } catch (err) {
- const el = document.getElementById('empty-state');
- if (el) el.style.display = '';
- return;
- }
-
- allRuns = data.runs;
- currentData = data;
- metadataQueries = data.metadata.queries ?? null;
-
- // Back-fill queryCategory for JSON generated before this feature.
- // Only classify from metadata.queries if there is exactly ONE dataset
- // with queryRuns AND the number of embedded queries matches the unique query count.
- // Otherwise the index mapping is unreliable (mixed-dataset JSON).
- if (data.queryRuns) {
- const datasets = [...new Set(data.queryRuns.map(r => r.dataset))];
- const uniqueQids = [...new Set(data.queryRuns.map(r => r.queryId))];
- const canBackfill = metadataQueries &&
- datasets.length === 1 &&
- metadataQueries.length === uniqueQids.length;
-
- data.queryRuns.forEach(r => {
- if (!r.queryCategory) {
- if (canBackfill) {
- const idx = parseInt((r.queryId ?? '').split('_')[1]) - 1;
- const sparql = idx >= 0 ? (metadataQueries[idx] ?? '') : '';
- r.queryCategory = _classifySparql(sparql);
- } else {
- r.queryCategory = 'GRAPH_PATTERN'; // unknown — hide type filter
- }
- }
- });
- }
-
- // Build color map from engines present in the data
- const engines = [...new Set(allRuns.map(r => r.engine))];
- buildColorMap(engines);
-
- // Restore state from URL before rendering (shareable links)
- applyUrlState();
-
- // Show last run date in header
- const runDateEl = document.getElementById('header-run-date');
- if (runDateEl && data.metadata?.generatedAt) {
- runDateEl.textContent = 'Last run: ' + formatDate(data.metadata.generatedAt);
- runDateEl.style.display = '';
- }
-
- renderHeader(data.metadata, allRuns);
- // Pills scroll arrows — listen once after pills are rendered
- const pillsWrap = document.getElementById('engine-pills');
- if (pillsWrap) {
- pillsWrap.addEventListener('scroll', updatePillsScrollBtns, { passive: true });
- new ResizeObserver(updatePillsScrollBtns).observe(pillsWrap);
- }
- updatePillsScrollBtns();
- renderDatasetPills(allRuns);
- _syncDatasetSections();
- updateQuerySectionVisibility();
- renderKPI(allRuns);
- renderDatasetCards(allRuns, metadataQueries);
- renderEngineCards(allRuns);
- renderSidebarMeta(data.metadata, engines, allRuns, data.queryRuns);
- initSidebar();
- applyStoredEngineOrder();
- initCharts();
- initTableSort();
- renderTable(allRuns);
- const meta = document.getElementById('full-results-meta');
- if (meta) meta.textContent = `${allRuns.length} rows · ${[...new Set(allRuns.map(r=>r.engine))].length} engines`;
-
- // Query section (optional — only if queryRuns present in JSON)
- if (data.queryRuns && data.queryRuns.length > 0) {
- _allQueryRunsGlobal = data.queryRuns;
- renderQuerySection(data.queryRuns);
- }
-
- // W3C Conformance — async, non-blocking
- loadW3CData().then(renderW3CSection);
-
- document.getElementById('btn-open-add-engine')?.addEventListener('click', openAddEngineModal);
- document.getElementById('btn-modal-cancel')?.addEventListener('click', closeAddEngineModal);
- document.getElementById('btn-modal-submit')?.addEventListener('click', () => {
- const family = document.getElementById('modal-select-triplestore')?.value;
- const version = document.getElementById('modal-select-version')?.value;
- if (!family || !version) return;
- const engineId = `${family}.${version}`;
- if (hiddenEngines.has(engineId)) {
- hiddenEngines.delete(engineId);
- // Re-add pill to comparator bar
- const wrap = document.getElementById('engine-pills');
- if (wrap && !wrap.querySelector(`[data-engine="${engineId}"]`)) {
- const dot = engineId.indexOf('.');
- const fam = dot >= 0 ? engineId.slice(0, dot) : engineId;
- const ver = dot >= 0 ? engineId.slice(dot + 1) : engineId;
- const pill = document.createElement('div');
- pill.className = `engine-pill family-${fam}`;
- pill.dataset.engine = engineId;
- pill.title = engineId;
- pill.draggable = true;
- pill.style.cursor = 'grab';
- pill.onclick = () => toggleEngine(engineId);
- pill.addEventListener('dragstart', pillDragStart);
- pill.addEventListener('dragover', pillDragOver);
- pill.addEventListener('drop', pillDrop);
- pill.addEventListener('dragend', pillDragEnd);
- pill.addEventListener('dragleave', pillDragLeave);
- pill.innerHTML = `${fam}${ver}
- `;
- wrap.appendChild(pill);
- }
- syncEnginePills();
- const filtered = getFilteredRuns(allRuns);
- renderKPI(filtered);
- renderEngineCards(getDatasetFilteredRuns());
- updateCharts();
- updateTable();
- }
- closeAddEngineModal();
- });
-
-}
-
-// ── Copy URL ──────────────────────────────────────────────────────────────────
-// ── URL shareable state ───────────────────────────────────────────────────────
-// Encodes: ?ds=dbpedia&engines=corese.4.6.5,jena.6.2.0&ref=corese.4.6.5
-// Called after any state change that should be reflected in the URL.
-
-function pushStateToUrl() {
- const params = new URLSearchParams();
- if (activeDatasets.size > 0) {
- params.set('ds', [...activeDatasets].join(','));
- }
- const visibleEngines = getEngineOrder().filter(e => !hiddenEngines.has(e));
- const allEngines = [...new Set(allRuns.map(r => r.engine))];
- // Only encode if different from "all engines"
- if (hiddenEngines.size > 0) {
- params.set('engines', visibleEngines.join(','));
- }
- if (activeEngines.size > 0) {
- params.set('filter', [...activeEngines].join(','));
- }
- if (userRefEngine) {
- params.set('ref', userRefEngine);
- }
- const qs = params.toString();
- const newUrl = qs ? `${location.pathname}?${qs}` : location.pathname;
- history.replaceState(null, '', newUrl);
-}
-
-function applyUrlState() {
- const params = new URLSearchParams(location.search);
-
- // Dataset
- const ds = params.get('ds');
- if (ds) {
- activeDatasets.clear();
- ds.split(',').forEach(d => d && activeDatasets.add(d));
- }
-
- // Hidden engines (engines= lists visible ones; those absent are hidden)
- const enginesParam = params.get('engines');
- if (enginesParam) {
- const visible = new Set(enginesParam.split(',').filter(Boolean));
- const all = [...new Set(allRuns.map(r => r.engine))];
- hiddenEngines.clear();
- all.forEach(e => { if (!visible.has(e)) hiddenEngines.add(e); });
- }
-
- // Engine filter (active selection)
- const filter = params.get('filter');
- if (filter) {
- activeEngines.clear();
- filter.split(',').forEach(e => e && activeEngines.add(e));
- }
-
- // Reference engine
- const ref = params.get('ref');
- if (ref) userRefEngine = ref;
-}
-
-// ── Export Markdown comparison report ─────────────────────────────────────────
-
-function exportQueryMarkdown() {
- const runs = (allQueryRuns ?? []).filter(r =>
- !hiddenEngines.has(r.engine) &&
- (activeQueryEngines.size === 0 || activeQueryEngines.has(r.engine)) &&
- (activeEngines.size === 0 || activeEngines.has(r.engine)) &&
- (activeDatasets.size === 0 || activeDatasets.has(r.dataset)) &&
- (activeQueryTypeFilter === 'all' || (r.queryCategory ?? 'GRAPH_PATTERN') === activeQueryTypeFilter)
- );
- if (runs.length === 0) return;
-
- const engines = [...new Set(runs.map(r => r.engine))];
- const qids = [...new Set(runs.map(r => r.queryId))].sort(
- (a, b) => parseInt(a.split('_')[1]) - parseInt(b.split('_')[1])
- );
- const meta = currentData?.metadata ?? {};
- const dataset = runs[0]?.dataset ?? '';
- const now = new Date().toISOString().slice(0, 10);
-
- const lines = [];
- lines.push(`# SPARQL Benchmark Comparison`);
- lines.push(``);
- lines.push(`**Dataset:** ${dataset} `);
- lines.push(`**Generated:** ${meta.generatedAt ?? now} `);
- lines.push(`**Java:** ${meta.java ?? '—'} `);
- lines.push(`**OS:** ${meta.os ?? '—'} `);
- lines.push(`**Protocol:** warmup + ${meta.protocol?.queryRepetitions ?? 3} repetitions, median `);
- if (activeQueryTypeFilter !== 'all') lines.push(`**Query type filter:** ${activeQueryTypeFilter} `);
- lines.push(``);
-
- const sep = `|---|${engines.map(() => '---:').join('|')}|---|`;
-
- // Execution time table
- lines.push(`## Median Execution Time (ms)`);
- lines.push(``);
- lines.push(`| Query | ${engines.join(' | ')} | Best |`);
- lines.push(sep);
- qids.forEach(qid => {
- const vals = engines.map(e => { const r = runs.find(r => r.engine === e && r.queryId === qid); return r && r.medianMs >= 0 ? r.medianMs : null; });
- const minMs = Math.min(...vals.filter(v => v !== null));
- const winner = isFinite(minMs) ? engines[vals.indexOf(minMs)] : null;
- lines.push(`| ${qid} | ${vals.map(v => v === null ? '—' : `${v.toLocaleString()} ms`).join(' | ')} | ${winner ?? '—'} |`);
- });
- lines.push(``);
-
- // TTFR table (only if data present)
- const hasTtfr = runs.some(r => r.medianTtfrMs != null && r.medianTtfrMs >= 0);
- if (hasTtfr) {
- lines.push(`## Time to First Result (TTFR, ms)`);
- lines.push(``);
- lines.push(`| Query | ${engines.join(' | ')} | Best |`);
- lines.push(sep);
- qids.forEach(qid => {
- const vals = engines.map(e => { const r = runs.find(r => r.engine === e && r.queryId === qid); return r && r.medianTtfrMs != null && r.medianTtfrMs >= 0 ? r.medianTtfrMs : null; });
- const minMs = Math.min(...vals.filter(v => v !== null));
- const winner = isFinite(minMs) ? engines[vals.indexOf(minMs)] : null;
- lines.push(`| ${qid} | ${vals.map(v => v === null ? '—' : `${v.toLocaleString()} ms`).join(' | ')} | ${winner ?? '—'} |`);
- });
- lines.push(``);
- }
-
- // Heap delta table
- const hasHeap = runs.some(r => r.heapDeltaMb != null);
- if (hasHeap) {
- lines.push(`## Heap Memory Delta (MB)`);
- lines.push(``);
- lines.push(`| Query | ${engines.join(' | ')} |`);
- lines.push(`|---|${engines.map(() => '---:').join('|')}|`);
- qids.forEach(qid => {
- const cells = engines.map(e => { const r = runs.find(r => r.engine === e && r.queryId === qid); return r && r.heapDeltaMb != null ? r.heapDeltaMb.toFixed(1) + ' MB' : '—'; });
- lines.push(`| ${qid} | ${cells.join(' | ')} |`);
- });
- lines.push(``);
- }
-
- const blob = new Blob([lines.join('\n')], { type: 'text/markdown;charset=utf-8;' });
- const url = URL.createObjectURL(blob);
- const a = document.createElement('a');
- a.href = url;
- a.download = `benchmark-${dataset}-${now}.md`;
- a.click();
- URL.revokeObjectURL(url);
-}
-
-// ── Export PDF (print-ready HTML report) ─────────────────────────────────────
-
-function exportQueryPdf() {
- const runs = (allQueryRuns ?? []).filter(r =>
- !hiddenEngines.has(r.engine) &&
- (activeQueryEngines.size === 0 || activeQueryEngines.has(r.engine)) &&
- (activeEngines.size === 0 || activeEngines.has(r.engine)) &&
- (activeDatasets.size === 0 || activeDatasets.has(r.dataset)) &&
- (activeQueryTypeFilter === 'all' || (r.queryCategory ?? 'GRAPH_PATTERN') === activeQueryTypeFilter)
- );
- if (runs.length === 0) return;
-
- const engines = [...new Set(runs.map(r => r.engine))];
- const qids = [...new Set(runs.map(r => r.queryId))].sort(
- (a, b) => parseInt(a.split('_')[1]) - parseInt(b.split('_')[1])
- );
- const meta = currentData?.metadata ?? {};
- const dataset = runs[0]?.dataset ?? '';
- const now = new Date().toISOString().slice(0, 10);
- const hasTtfr = runs.some(r => r.medianTtfrMs != null && r.medianTtfrMs >= 0);
- const hasHeap = runs.some(r => r.heapDeltaMb != null);
-
- const ENGINE_COLORS = ['#4e79a7','#f28e2b','#59a14f','#e15759','#76b7b2','#edc948','#b07aa1','#ff9da7'];
- const colorMap = {};
- engines.forEach((e, i) => { colorMap[e] = ENGINE_COLORS[i % ENGINE_COLORS.length]; });
-
- const thStyle = `style="padding:6px 10px;text-align:right;border:1px solid #ddd;background:#f5f5f5;font-weight:600"`;
- const th0Style = `style="padding:6px 10px;text-align:left;border:1px solid #ddd;background:#f5f5f5;font-weight:600"`;
- const tdStyle = `style="padding:5px 10px;text-align:right;border:1px solid #ddd"`;
- const td0Style = `style="padding:5px 10px;text-align:left;border:1px solid #ddd;font-family:monospace"`;
-
- function buildTable(title, getCellFn, showBest) {
- const header = `| Query | ${engines.map(e =>
- `${e} | `).join('')}${showBest ? `Best | ` : ''}
`;
- const rows = qids.map(qid => {
- const vals = engines.map(e => getCellFn(runs.find(r => r.engine === e && r.queryId === qid)));
- const nums = vals.map(v => typeof v === 'number' ? v : null);
- const minV = Math.min(...nums.filter(v => v !== null));
- const wiIdx = isFinite(minV) ? nums.indexOf(minV) : -1;
- const cells = vals.map((v, i) => {
- const isWin = showBest && i === wiIdx;
- const disp = v === null ? '—' : typeof v === 'number' ? v.toLocaleString() : v;
- return `${disp} | `;
- });
- const bestCell = showBest ? `${wiIdx >= 0 ? `${engines[wiIdx]}` : '—'} | ` : '';
- return `| ${qid} | ${cells.join('')}${bestCell}
`;
- }).join('');
- return `${title}
- `;
- }
-
- const execTable = buildTable('Median Execution Time (ms)',
- r => (r && r.medianMs >= 0) ? r.medianMs : null, true);
- const ttfrTable = hasTtfr ? buildTable('Time to First Result — TTFR (ms)',
- r => (r && r.medianTtfrMs != null && r.medianTtfrMs >= 0) ? r.medianTtfrMs : null, true) : '';
- const heapTable = hasHeap ? buildTable('Heap Memory Delta (MB)',
- r => (r && r.heapDeltaMb != null) ? r.heapDeltaMb.toFixed(1) + ' MB' : null, false) : '';
-
- const filterNote = activeQueryTypeFilter !== 'all'
- ? `Query type filter: ${activeQueryTypeFilter}
` : '';
-
- const html = `
- SPARQL Benchmark — ${dataset} — ${now}
-
-
- SPARQL Benchmark Comparison
- Dataset: ${dataset}
- Generated: ${meta.generatedAt ?? now}
- Java: ${meta.java ?? '—'} · OS: ${meta.os ?? '—'}
- Protocol: warmup + ${meta.protocol?.queryRepetitions ?? 3} repetitions, median
- ${filterNote}
- ${execTable}${ttfrTable}${heapTable}
- Generated by corese-benchmark dashboard — ${now}
- `;
-
- // Use a hidden iframe to avoid popup blocker issues
- let iframe = document.getElementById('_pdf-print-frame');
- if (iframe) iframe.remove();
- iframe = document.createElement('iframe');
- iframe.id = '_pdf-print-frame';
- iframe.style.cssText = 'position:fixed;top:-9999px;left:-9999px;width:1px;height:1px;border:none';
- document.body.appendChild(iframe);
- iframe.contentDocument.open();
- iframe.contentDocument.write(html);
- iframe.contentDocument.close();
- setTimeout(() => { iframe.contentWindow.focus(); iframe.contentWindow.print(); }, 400);
-}
-
-// ── Export JSON (filtered view) ───────────────────────────────────────────────
-
-function exportFilteredJson() {
- const runs = getFilteredRuns(allRuns);
- const queryRuns = (allQueryRuns ?? []).filter(r =>
- !hiddenEngines.has(r.engine) &&
- (activeEngines.size === 0 || activeEngines.has(r.engine)) &&
- (activeDatasets.size === 0 || activeDatasets.has(r.dataset))
- );
- if (runs.length === 0 && queryRuns.length === 0) return;
-
- const payload = { metadata: currentData?.metadata ?? {}, runs };
- if (queryRuns.length > 0) payload.queryRuns = queryRuns;
-
- const blob = new Blob([JSON.stringify(payload, null, 2)], { type: 'application/json;charset=utf-8;' });
- const url = URL.createObjectURL(blob);
- const a = document.createElement('a');
- a.href = url;
- a.download = `benchmark-filtered-${new Date().toISOString().slice(0,10)}.json`;
- a.click();
- URL.revokeObjectURL(url);
-}
-
-// ── Export CSV (filtered view) ────────────────────────────────────────────────
-
-function exportFilteredCsv() {
- const runs = getFilteredRuns(allRuns);
- const queryRuns = (allQueryRuns ?? []).filter(r =>
- !hiddenEngines.has(r.engine) &&
- (activeEngines.size === 0 || activeEngines.has(r.engine)) &&
- (activeDatasets.size === 0 || activeDatasets.has(r.dataset))
- );
- if (runs.length === 0 && queryRuns.length === 0) return;
-
- const escape = v => `"${String(v ?? '').replace(/"/g, '""')}"`;
- const lines = [];
-
- if (runs.length > 0) {
- const hdr = ['engine', 'dataset', 'file', 'triples', 'loadingTimeMs', 'memoryDeltaMb', 'cpuPercent'];
- lines.push('# LOAD BENCHMARK');
- lines.push(hdr.join(','));
- runs.forEach(r => lines.push(hdr.map(h => escape(r[h])).join(',')));
- }
-
- if (queryRuns.length > 0) {
- if (lines.length) lines.push('');
- lines.push('# QUERY BENCHMARK');
- lines.push(['engine', 'dataset', 'queryId', 'medianMs'].join(','));
- queryRuns.forEach(r =>
- lines.push([escape(r.engine), escape(r.dataset), escape(r.queryId), escape(r.medianMs)].join(','))
- );
- }
-
- const blob = new Blob([lines.join('\n')], { type: 'text/csv;charset=utf-8;' });
- const url = URL.createObjectURL(blob);
- const a = document.createElement('a');
- a.href = url;
- a.download = `benchmark-filtered-${new Date().toISOString().slice(0,10)}.csv`;
- a.click();
- URL.revokeObjectURL(url);
-}
-
-main();
diff --git a/site/build-bundle.js b/site/build-bundle.js
new file mode 100644
index 0000000..dc2c612
--- /dev/null
+++ b/site/build-bundle.js
@@ -0,0 +1,67 @@
+// build-bundle.js — Concatenate ES6 modules into a single non-module script
+// Usage: node build-bundle.js
+'use strict';
+
+const fs = require('fs');
+const path = require('path');
+
+const BASE = path.join(__dirname, 'js');
+
+// Files in dependency order
+const FILES = [
+ 'state.js',
+ 'formatters.js',
+ 'data-loader.js',
+ 'components/status-badge.js',
+ 'components/result-dialog.js',
+ 'components/result-table.js',
+ 'charts/loading-chart.js',
+ 'charts/throughput-chart.js',
+ 'charts/cpu-chart.js',
+ 'charts/query-breakdown.js',
+ 'chart-expand.js',
+ 'pages/overview.js',
+ 'pages/bowlogna.js',
+ 'pages/bsbm.js',
+ 'pages/lubm.js',
+ 'pages/dbpedia.js',
+ 'pages/w3c.js',
+ 'pages/transparency.js',
+ 'export-md.js',
+ 'export-pdf.js',
+ 'export-csv.js',
+ 'app.js',
+];
+
+// Files whose top-level consts should be block-scoped to avoid collisions
+// (these files are wrapped in { } blocks; function declarations hoist in sloppy mode)
+const BLOCK_WRAP = new Set([
+ 'pages/bowlogna.js', 'pages/bsbm.js', 'pages/lubm.js', 'pages/dbpedia.js',
+ 'charts/query-breakdown.js',
+]);
+
+let bundle = '// bundle.js — Auto-generated. Do not edit directly.\n// Run: node build-bundle.js\n(function () {\n// sloppy mode intentional: block-level function declarations hoist to this scope\n\n';
+
+for (const file of FILES) {
+ let src = fs.readFileSync(path.join(BASE, file), 'utf8');
+
+ const cleaned = src
+ .split('\n')
+ .filter(line => !line.match(/^'use strict';?$/))
+ .filter(line => !line.match(/^import .+from .+;$/))
+ .filter(line => !line.match(/^export default \w+;$/))
+ .map(line => line.replace(/^export (async function|function|const|let|class) /, '$1 '))
+ .join('\n');
+
+ if (BLOCK_WRAP.has(file)) {
+ bundle += `// ── ${file} ──\n{\n${cleaned}\n}\n\n`;
+ } else {
+ bundle += `// ── ${file} ──\n${cleaned}\n\n`;
+ }
+}
+
+bundle += '})();\n';
+
+const out = path.join(__dirname, 'js', 'bundle.js');
+fs.writeFileSync(out, bundle, 'utf8');
+console.log(`Written ${out} (${(bundle.length / 1024).toFixed(1)} KB)`);
diff --git a/site/data/mock-report-v2.json b/site/data/mock-report-v2.json
index 9cb6a04..741b7af 100644
--- a/site/data/mock-report-v2.json
+++ b/site/data/mock-report-v2.json
@@ -13,10 +13,10 @@
"cpuSockets": 1,
"cpuCores": 16,
"cpuThreads": 32,
- "cpuFrequencyMhz": 2450.0,
+ "cpuFrequencyMhz": 2450,
"cpuGovernor": "performance",
- "ramTotalGb": 64.0,
- "swapTotalGb": 8.0,
+ "ramTotalGb": 64,
+ "swapTotalGb": 8,
"swappiness": 1,
"osDistribution": "Ubuntu 24.04.1 LTS",
"osKernel": "6.8.0-45-generic",
@@ -37,15 +37,381 @@
"metric": "median"
},
"engines": [
- { "id": "corese.next", "family": "corese", "version": "5.0.0-SNAPSHOT", "label": "Corese v5 (Next)" },
- { "id": "jena.6.2.0", "family": "jena", "version": "6.2.0", "label": "Apache Jena 6.2.0" },
- { "id": "rdf4j.5.3.2", "family": "rdf4j", "version": "5.3.2", "label": "Eclipse RDF4J 5.3.2" }
+ {
+ "id": "corese.next",
+ "family": "corese",
+ "version": "5.0.0-SNAPSHOT",
+ "label": "Corese v5 (Next)"
+ },
+ {
+ "id": "corese.4.6.5",
+ "family": "corese",
+ "version": "4.6.5",
+ "label": "Corese v4.6.5"
+ },
+ {
+ "id": "jena.6.2.0",
+ "family": "jena",
+ "version": "6.2.0",
+ "label": "Apache Jena 6.2.0"
+ },
+ {
+ "id": "rdf4j.5.3.2",
+ "family": "rdf4j",
+ "version": "5.3.2",
+ "label": "Eclipse RDF4J 5.3.2"
+ }
],
"datasetQueries": {
"bowlogna": [
- { "id": "query_1", "category": "GRAPH_PATTERN", "label": "Count Master Theses", "sparql": "PREFIX rdf: PREFIX bb: SELECT (COUNT(?X) as ?MasterTheses) WHERE { ?X rdf:type bb:Master_Thesis }", "expectedRowCount": 1, "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" },
- { "id": "query_8", "category": "AGGREGATION", "label": "Failures for teaching unit (GROUP BY)", "sparql": "PREFIX rdf: PREFIX bb: SELECT DISTINCT ?X (count(?E) as ?Failures) WHERE { ?X rdf:type bb:Teaching_Unit . ?E bb:evaluatesTeachingUnit ?X . ?E bb:hasMark ?Y . FILTER (?Y < 3) } GROUP BY ?X", "expectedRowCount": 42, "expectedHash": "8f3e2a0459a1c8996fb92427ae41e4649b934ca495991b7852b8554a7b9c1e11" },
- { "id": "query_10", "category": "REGEX_TEMPORAL", "label": "Supervised theses ranking (REGEX, LIMIT)", "sparql": "PREFIX rdf: PREFIX bb: SELECT ?X (COUNT(?Y) as ?num) WHERE { ?X rdf:type bb:Professor . ?Y bb:supervisedBy ?X . ?Y rdf:type ?t . FILTER REGEX (?t, 'Thesis', 'i') } GROUP BY ?X ORDER BY DESC(?num) LIMIT 1", "expectedRowCount": 1, "expectedHash": "2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae" }
+ {
+ "id": "query_1",
+ "category": "GRAPH_PATTERN",
+ "label": "Q1",
+ "sparql": "SELECT (COUNT(?X) as ?n) WHERE { ?X a bb:Master_Thesis }",
+ "expectedRowCount": 1,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_2",
+ "category": "GRAPH_PATTERN",
+ "label": "Q2",
+ "sparql": "SELECT ?X WHERE { ?X a bb:Master_Thesis ; bb:hasMention ?m }",
+ "expectedRowCount": 312,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_3",
+ "category": "REGEX_TEMPORAL",
+ "label": "Q3",
+ "sparql": "SELECT ?X WHERE { ?X a bb:Student ; bb:graduatedAt ?d . FILTER(xsd:dateTime(?d) < NOW()) }",
+ "expectedRowCount": 980,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_4",
+ "category": "REGEX_TEMPORAL",
+ "label": "Q4",
+ "sparql": "SELECT ?X WHERE { ?X a bb:Student ; bb:enrolledIn ?m . FILTER(xsd:dateTime(?m) < NOW()) }",
+ "expectedRowCount": 452,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_5",
+ "category": "COMPLEX_JOIN",
+ "label": "Q5",
+ "sparql": "SELECT ?X (SUM(?c) as ?ects) WHERE { ?X bb:took ?u . ?u bb:hasCredits ?c } GROUP BY ?X",
+ "expectedRowCount": 62,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_6",
+ "category": "REGEX_TEMPORAL",
+ "label": "Q6",
+ "sparql": "SELECT ?X WHERE { ?X a bb:Student ; bb:lastName ?ln . FILTER(regex(?ln,\"^D\")) }",
+ "expectedRowCount": 145,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_7",
+ "category": "COMPLEX_JOIN",
+ "label": "Q7",
+ "sparql": "SELECT ?X ?Y WHERE { ?X bb:attr1 ?A . ?A bb:attr2 ?Y }",
+ "expectedRowCount": 88,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_8",
+ "category": "AGGREGATION",
+ "label": "Q8",
+ "sparql": "SELECT ?X (COUNT(?E) as ?Failures) WHERE { ?X a bb:Teaching_Unit . ?E bb:hasMark ?Y . FILTER(?Y < 3) } GROUP BY ?X",
+ "expectedRowCount": 42,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_9",
+ "category": "AGGREGATION",
+ "label": "Q9",
+ "sparql": "SELECT ?X (COUNT(?E) as ?Evals) WHERE { ?X a bb:Teaching_Unit . ?E bb:evaluatesTeachingUnit ?X } GROUP BY ?X",
+ "expectedRowCount": 42,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_10",
+ "category": "REGEX_TEMPORAL",
+ "label": "Q10",
+ "sparql": "SELECT ?X (COUNT(?Y) as ?n) WHERE { ?X a bb:Professor . ?Y bb:supervisedBy ?X . FILTER REGEX(?t,\"Thesis\",\"i\") } GROUP BY ?X ORDER BY DESC(?n) LIMIT 1",
+ "expectedRowCount": 1,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_11",
+ "category": "AGGREGATION",
+ "label": "Q11",
+ "sparql": "SELECT ?X (AVG(?m) as ?avg) WHERE { ?X a bb:Student ; bb:hasMark ?m } GROUP BY ?X ORDER BY DESC(?avg) LIMIT 5",
+ "expectedRowCount": 5,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_12",
+ "category": "AGGREGATION",
+ "label": "Q12",
+ "sparql": "SELECT ?T (AVG(?d) as ?dur) WHERE { ?T a bb:Track ; bb:duration ?d } GROUP BY ?T",
+ "expectedRowCount": 18,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_13",
+ "category": "AGGREGATION",
+ "label": "Q13",
+ "sparql": "SELECT (AVG(?m) as ?avg) WHERE { ?X bb:hasMark ?m ; bb:atSemester 1 }",
+ "expectedRowCount": 1,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_14",
+ "category": "COMPLEX_JOIN",
+ "label": "Q14",
+ "sparql": "SELECT ?D ?P WHERE { ?X a bb:Student ; bb:inDept ?D . ?P a bb:Professor ; bb:inDept ?D }",
+ "expectedRowCount": 28,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_15",
+ "category": "GRAPH_PATTERN",
+ "label": "Q15",
+ "sparql": "SELECT ?U WHERE { ?U a bb:Teaching_Unit ; bb:language \"en\" }",
+ "expectedRowCount": 7,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_16",
+ "category": "REGEX_TEMPORAL",
+ "label": "Q16",
+ "sparql": "SELECT ?X WHERE { ?X a bb:Student ; bb:enrolledFrom ?s . FILTER(?s >= \"2020-01-01\"^^xsd:date) }",
+ "expectedRowCount": 220,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_17",
+ "category": "REGEX_TEMPORAL",
+ "label": "Q17",
+ "sparql": "SELECT ?X WHERE { ?X a bb:Student ; bb:enrolledTo ?e . FILTER(?e <= \"2025-12-31\"^^xsd:date) }",
+ "expectedRowCount": 195,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ ],
+ "bsbm": [
+ {
+ "id": "query_1",
+ "category": "SEARCH",
+ "label": "Q1",
+ "sparql": "SELECT DISTINCT ?product WHERE { ?product a bsbm:Product ; bsbm:productFeature ?f1 ; bsbm:productPropertyNumeric1 ?v1 . FILTER(?v1 > 450) } ORDER BY ?product LIMIT 10",
+ "expectedRowCount": 10,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_2",
+ "category": "SEARCH",
+ "label": "Q2",
+ "sparql": "SELECT ?label ?comment ?producer WHERE { ?p rdfs:label ?label ; rdfs:comment ?comment ; bsbm:producer ?producer }",
+ "expectedRowCount": 1,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_3",
+ "category": "SEARCH",
+ "label": "Q3",
+ "sparql": "SELECT ?product WHERE { ?product a bsbm:Product ; bsbm:productFeature ?f ; bsbm:productPropertyNumeric1 ?v1 ; bsbm:productPropertyNumeric3 ?v3 . FILTER(?v1 > 350 && ?v3 < 950) } LIMIT 10",
+ "expectedRowCount": 10,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_4",
+ "category": "SEARCH",
+ "label": "Q4",
+ "sparql": "SELECT ?product ?label WHERE { { ?product bsbm:productFeature ?f } UNION { ?product rdfs:label ?label . FILTER regex(?label,\"en\") } } ORDER BY ?label LIMIT 10",
+ "expectedRowCount": 10,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_5",
+ "category": "JOIN",
+ "label": "Q5",
+ "sparql": "SELECT DISTINCT ?product WHERE { ?product bsbm:productFeature ?f . ?p2 bsbm:productFeature ?f . FILTER(?product != ?p2) } LIMIT 5",
+ "expectedRowCount": 5,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_6",
+ "category": "REVIEW",
+ "label": "Q6",
+ "sparql": "SELECT ?review ?title WHERE { ?review a bsbm:Review ; dc:title ?title ; bsbm:reviewFor ?product } LIMIT 10",
+ "expectedRowCount": 10,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_7",
+ "category": "OFFER",
+ "label": "Q7",
+ "sparql": "SELECT ?offer ?price WHERE { ?offer a bsbm:Offer ; bsbm:price ?price ; bsbm:product ?product } ORDER BY ?price LIMIT 10",
+ "expectedRowCount": 10,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_8",
+ "category": "OFFER",
+ "label": "Q8",
+ "sparql": "SELECT ?title ?text WHERE { ?review dc:title ?title ; rev:text ?text ; bsbm:reviewFor ?product }",
+ "expectedRowCount": 1,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_9",
+ "category": "REVIEW",
+ "label": "Q9",
+ "sparql": "SELECT DISTINCT ?reviewer WHERE { ?review bsbm:reviewFor ?product ; rev:reviewer ?reviewer } LIMIT 10",
+ "expectedRowCount": 10,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_10",
+ "category": "OFFER",
+ "label": "Q10",
+ "sparql": "SELECT DISTINCT ?offer ?vendor WHERE { ?offer bsbm:vendor ?vendor ; bsbm:product ?product } LIMIT 10",
+ "expectedRowCount": 10,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_11",
+ "category": "REVIEW",
+ "label": "Q11",
+ "sparql": "SELECT ?review ?rating WHERE { ?review bsbm:rating1 ?r1 ; bsbm:rating2 ?r2 . BIND((?r1+?r2)/2 AS ?rating) } LIMIT 10",
+ "expectedRowCount": 10,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_12",
+ "category": "REVIEW",
+ "label": "Q12",
+ "sparql": "SELECT ?review WHERE { ?review a bsbm:Review ; bsbm:reviewFor ?product . FILTER NOT EXISTS { ?other bsbm:reviewFor ?product . FILTER(?other != ?review) } } LIMIT 5",
+ "expectedRowCount": 5,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
+ ],
+ "lubm": [
+ {
+ "id": "query_1",
+ "category": "SELECTIVE",
+ "label": "Q1",
+ "sparql": "SELECT ?X WHERE { ?X a ub:GraduateStudent ; ub:takesCourse ?C . ?C a ub:GraduateCourse ; ub:subOrganizationOf }",
+ "expectedRowCount": 4,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_2",
+ "category": "LARGE_RESULT",
+ "label": "Q2",
+ "sparql": "SELECT ?X ?Y ?Z WHERE { ?X a ub:GraduateStudent ; ub:memberOf ?Y . ?Y a ub:Department ; ub:subOrganizationOf ?Z . ?Z a ub:University }",
+ "expectedRowCount": 2348,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_3",
+ "category": "SELECTIVE",
+ "label": "Q3",
+ "sparql": "SELECT ?X WHERE { ?X a ub:Publication ; ub:publicationAuthor ?Y . ?Y ub:memberOf }",
+ "expectedRowCount": 6,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_4",
+ "category": "TRANSITIVE",
+ "label": "Q4",
+ "sparql": "SELECT ?X ?Y1 ?Y2 ?Y3 WHERE { ?X a ub:Professor ; ub:worksFor ; ub:name ?Y1 ; ub:emailAddress ?Y2 ; ub:telephone ?Y3 }",
+ "expectedRowCount": 34,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_5",
+ "category": "SELECTIVE",
+ "label": "Q5",
+ "sparql": "SELECT ?X WHERE { ?X a ub:Person ; ub:memberOf }",
+ "expectedRowCount": 719,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_6",
+ "category": "LARGE_RESULT",
+ "label": "Q6",
+ "sparql": "SELECT ?X WHERE { ?X a ub:Student }",
+ "expectedRowCount": 7790,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_7",
+ "category": "SELECTIVE",
+ "label": "Q7",
+ "sparql": "SELECT ?X ?Y WHERE { ?X a ub:Student ; ub:takesCourse ?Y . ?Y a ub:Course . ?Y ub:teachingAssistantOf ?X }",
+ "expectedRowCount": 67,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_8",
+ "category": "SELECTIVE",
+ "label": "Q8",
+ "sparql": "SELECT ?X ?Y ?Z WHERE { ?X a ub:Student ; ub:emailAddress ?Y ; ub:memberOf ?Z . ?Z a ub:Department ; ub:subOrganizationOf }",
+ "expectedRowCount": 7790,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_9",
+ "category": "LARGE_RESULT",
+ "label": "Q9",
+ "sparql": "SELECT ?X ?Y ?Z WHERE { ?X a ub:Student ; ub:advisor ?Y ; ub:takesCourse ?Z . ?Y ub:teacherOf ?Z }",
+ "expectedRowCount": 208,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_10",
+ "category": "SELECTIVE",
+ "label": "Q10",
+ "sparql": "SELECT ?X WHERE { ?X a ub:Student ; ub:takesCourse ?C . ?C a ub:GraduateCourse ; ub:subOrganizationOf }",
+ "expectedRowCount": 4,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_11",
+ "category": "TRANSITIVE",
+ "label": "Q11",
+ "sparql": "SELECT ?X WHERE { ?X a ub:ResearchGroup ; ub:subOrganizationOf }",
+ "expectedRowCount": 224,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_12",
+ "category": "TRANSITIVE",
+ "label": "Q12",
+ "sparql": "SELECT ?X ?Y WHERE { ?X a ub:Chair ; ub:worksFor ?Y . ?Y ub:subOrganizationOf }",
+ "expectedRowCount": 15,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_13",
+ "category": "TRANSITIVE",
+ "label": "Q13",
+ "sparql": "SELECT ?X WHERE { ?X a ub:Person ; ub:hasAlumnus }",
+ "expectedRowCount": 1,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ },
+ {
+ "id": "query_14",
+ "category": "SELECTIVE",
+ "label": "Q14",
+ "sparql": "SELECT ?X WHERE { ?X a ub:UndergraduateStudent }",
+ "expectedRowCount": 5916,
+ "expectedHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
+ }
]
}
},
@@ -56,18 +422,91 @@
"file": "bowlogna.ttl",
"triples": 1234567,
"loadingTimeMs": 2450,
- "repetitionsMs": [2610, 2450, 2430],
- "throughputTriplesPerSec": 503904.8,
- "memoryBeforeMb": 42.1,
- "memoryAfterMb": 387.3,
- "memoryDeltaMb": 345.2,
- "cpuPercent": 85.4,
+ "repetitionsMs": [
+ 2597,
+ 2450,
+ 2377
+ ],
+ "throughputTriplesPerSec": 503905,
+ "memoryBeforeMb": 40,
+ "memoryAfterMb": 488.3363818257978,
+ "memoryDeltaMb": 448.3363818257978,
+ "cpuPercent": 80,
"timeSeries": [
- { "elapsedMs": 0, "triplesLoaded": 0, "heapUsedMb": 42.1 },
- { "elapsedMs": 500, "triplesLoaded": 310000, "heapUsedMb": 115.4 },
- { "elapsedMs": 1000, "triplesLoaded": 650000, "heapUsedMb": 198.0 },
- { "elapsedMs": 1500, "triplesLoaded": 980000, "heapUsedMb": 280.2 },
- { "elapsedMs": 2000, "triplesLoaded": 1234567, "heapUsedMb": 387.3 }
+ {
+ "elapsedMs": 0,
+ "triplesLoaded": 0,
+ "heapUsedMb": 42
+ },
+ {
+ "elapsedMs": 500,
+ "triplesLoaded": 310000,
+ "heapUsedMb": 115
+ },
+ {
+ "elapsedMs": 1000,
+ "triplesLoaded": 650000,
+ "heapUsedMb": 198
+ },
+ {
+ "elapsedMs": 1500,
+ "triplesLoaded": 980000,
+ "heapUsedMb": 280
+ },
+ {
+ "elapsedMs": 2000,
+ "triplesLoaded": 1234567,
+ "heapUsedMb": 387
+ }
+ ]
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "bowlogna",
+ "file": "bowlogna.ttl",
+ "triples": 1234567,
+ "loadingTimeMs": 3850,
+ "repetitionsMs": [
+ 4081,
+ 3850,
+ 3735
+ ],
+ "throughputTriplesPerSec": 320667,
+ "memoryBeforeMb": 40,
+ "memoryAfterMb": 506.5544779042716,
+ "memoryDeltaMb": 466.5544779042716,
+ "cpuPercent": 86,
+ "timeSeries": [
+ {
+ "elapsedMs": 0,
+ "triplesLoaded": 0,
+ "heapUsedMb": 44
+ },
+ {
+ "elapsedMs": 500,
+ "triplesLoaded": 260000,
+ "heapUsedMb": 125
+ },
+ {
+ "elapsedMs": 1000,
+ "triplesLoaded": 560000,
+ "heapUsedMb": 215
+ },
+ {
+ "elapsedMs": 1500,
+ "triplesLoaded": 880000,
+ "heapUsedMb": 310
+ },
+ {
+ "elapsedMs": 2000,
+ "triplesLoaded": 1150000,
+ "heapUsedMb": 405
+ },
+ {
+ "elapsedMs": 2500,
+ "triplesLoaded": 1234567,
+ "heapUsedMb": 430
+ }
]
},
{
@@ -76,18 +515,42 @@
"file": "bowlogna.ttl",
"triples": 1234567,
"loadingTimeMs": 2180,
- "repetitionsMs": [2250, 2180, 2160],
- "throughputTriplesPerSec": 566315.1,
- "memoryBeforeMb": 45.0,
- "memoryAfterMb": 412.0,
- "memoryDeltaMb": 367.0,
- "cpuPercent": 92.1,
+ "repetitionsMs": [
+ 2311,
+ 2180,
+ 2115
+ ],
+ "throughputTriplesPerSec": 566315,
+ "memoryBeforeMb": 40,
+ "memoryAfterMb": 447.40680901841904,
+ "memoryDeltaMb": 407.40680901841904,
+ "cpuPercent": 87,
"timeSeries": [
- { "elapsedMs": 0, "triplesLoaded": 0, "heapUsedMb": 45.0 },
- { "elapsedMs": 500, "triplesLoaded": 350000, "heapUsedMb": 130.0 },
- { "elapsedMs": 1000, "triplesLoaded": 720000, "heapUsedMb": 220.0 },
- { "elapsedMs": 1500, "triplesLoaded": 1050000, "heapUsedMb": 315.0 },
- { "elapsedMs": 2000, "triplesLoaded": 1234567, "heapUsedMb": 412.0 }
+ {
+ "elapsedMs": 0,
+ "triplesLoaded": 0,
+ "heapUsedMb": 45
+ },
+ {
+ "elapsedMs": 500,
+ "triplesLoaded": 350000,
+ "heapUsedMb": 130
+ },
+ {
+ "elapsedMs": 1000,
+ "triplesLoaded": 720000,
+ "heapUsedMb": 220
+ },
+ {
+ "elapsedMs": 1500,
+ "triplesLoaded": 1050000,
+ "heapUsedMb": 315
+ },
+ {
+ "elapsedMs": 2000,
+ "triplesLoaded": 1234567,
+ "heapUsedMb": 412
+ }
]
},
{
@@ -96,20 +559,552 @@
"file": "bowlogna.ttl",
"triples": 1234567,
"loadingTimeMs": 3150,
- "repetitionsMs": [3300, 3150, 3120],
- "throughputTriplesPerSec": 391926.0,
- "memoryBeforeMb": 40.5,
- "memoryAfterMb": 510.5,
- "memoryDeltaMb": 470.0,
- "cpuPercent": 78.5,
+ "repetitionsMs": [
+ 3339,
+ 3150,
+ 3056
+ ],
+ "throughputTriplesPerSec": 391926,
+ "memoryBeforeMb": 40,
+ "memoryAfterMb": 480.8698035181285,
+ "memoryDeltaMb": 440.8698035181285,
+ "cpuPercent": 87,
"timeSeries": [
- { "elapsedMs": 0, "triplesLoaded": 0, "heapUsedMb": 40.5 },
- { "elapsedMs": 500, "triplesLoaded": 220000, "heapUsedMb": 110.0 },
- { "elapsedMs": 1000, "triplesLoaded": 480000, "heapUsedMb": 210.0 },
- { "elapsedMs": 1500, "triplesLoaded": 750000, "heapUsedMb": 320.0 },
- { "elapsedMs": 2000, "triplesLoaded": 1020000, "heapUsedMb": 430.0 },
- { "elapsedMs": 2500, "triplesLoaded": 1234567, "heapUsedMb": 510.5 }
+ {
+ "elapsedMs": 0,
+ "triplesLoaded": 0,
+ "heapUsedMb": 40
+ },
+ {
+ "elapsedMs": 500,
+ "triplesLoaded": 220000,
+ "heapUsedMb": 110
+ },
+ {
+ "elapsedMs": 1000,
+ "triplesLoaded": 480000,
+ "heapUsedMb": 210
+ },
+ {
+ "elapsedMs": 1500,
+ "triplesLoaded": 750000,
+ "heapUsedMb": 320
+ },
+ {
+ "elapsedMs": 2000,
+ "triplesLoaded": 1020000,
+ "heapUsedMb": 430
+ },
+ {
+ "elapsedMs": 2500,
+ "triplesLoaded": 1234567,
+ "heapUsedMb": 510
+ }
]
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "bsbm",
+ "file": "bsbm_1m.nt",
+ "triples": 1800000,
+ "loadingTimeMs": 3800,
+ "repetitionsMs": [
+ 4028,
+ 3800,
+ 3686
+ ],
+ "throughputTriplesPerSec": 473684,
+ "memoryBeforeMb": 45,
+ "memoryAfterMb": 518.9258269786317,
+ "memoryDeltaMb": 473.9258269786317,
+ "cpuPercent": 81,
+ "timeSeries": []
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "bsbm",
+ "file": "bsbm_1m.nt",
+ "triples": 1800000,
+ "loadingTimeMs": 5900,
+ "repetitionsMs": [
+ 6254,
+ 5900,
+ 5723
+ ],
+ "throughputTriplesPerSec": 305085,
+ "memoryBeforeMb": 45,
+ "memoryAfterMb": 576.588974860786,
+ "memoryDeltaMb": 531.588974860786,
+ "cpuPercent": 91,
+ "timeSeries": []
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "bsbm",
+ "file": "bsbm_1m.nt",
+ "triples": 1800000,
+ "loadingTimeMs": 3200,
+ "repetitionsMs": [
+ 3392,
+ 3200,
+ 3104
+ ],
+ "throughputTriplesPerSec": 562500,
+ "memoryBeforeMb": 45,
+ "memoryAfterMb": 519.1516301348852,
+ "memoryDeltaMb": 474.1516301348852,
+ "cpuPercent": 81,
+ "timeSeries": []
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "bsbm",
+ "file": "bsbm_1m.nt",
+ "triples": 1800000,
+ "loadingTimeMs": 5100,
+ "repetitionsMs": [
+ 5406,
+ 5100,
+ 4947
+ ],
+ "throughputTriplesPerSec": 352941,
+ "memoryBeforeMb": 45,
+ "memoryAfterMb": 547.1946881304165,
+ "memoryDeltaMb": 502.19468813041647,
+ "cpuPercent": 78,
+ "timeSeries": []
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "lubm",
+ "file": "lubm_univ10.nt",
+ "triples": 3200000,
+ "loadingTimeMs": 7200,
+ "repetitionsMs": [
+ 7632,
+ 7200,
+ 6984
+ ],
+ "throughputTriplesPerSec": 444444,
+ "memoryBeforeMb": 50,
+ "memoryAfterMb": 972.0157225835871,
+ "memoryDeltaMb": 922.0157225835871,
+ "cpuPercent": 92,
+ "timeSeries": []
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "lubm",
+ "file": "lubm_univ10.nt",
+ "triples": 3200000,
+ "loadingTimeMs": 11400,
+ "repetitionsMs": [
+ 12084,
+ 11400,
+ 11058
+ ],
+ "throughputTriplesPerSec": 280702,
+ "memoryBeforeMb": 50,
+ "memoryAfterMb": 880.2340201735084,
+ "memoryDeltaMb": 830.2340201735084,
+ "cpuPercent": 93,
+ "timeSeries": []
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "lubm",
+ "file": "lubm_univ10.nt",
+ "triples": 3200000,
+ "loadingTimeMs": 5800,
+ "repetitionsMs": [
+ 6148,
+ 5800,
+ 5626
+ ],
+ "throughputTriplesPerSec": 551724,
+ "memoryBeforeMb": 50,
+ "memoryAfterMb": 1011.3881346414328,
+ "memoryDeltaMb": 961.3881346414328,
+ "cpuPercent": 88,
+ "timeSeries": []
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "lubm",
+ "file": "lubm_univ10.nt",
+ "triples": 3200000,
+ "loadingTimeMs": 9400,
+ "repetitionsMs": [
+ 9964,
+ 9400,
+ 9118
+ ],
+ "throughputTriplesPerSec": 340426,
+ "memoryBeforeMb": 50,
+ "memoryAfterMb": 959.782982834467,
+ "memoryDeltaMb": 909.782982834467,
+ "cpuPercent": 85,
+ "timeSeries": []
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "dbpedia",
+ "file": "persondata_en.nt",
+ "triples": 356914,
+ "loadingTimeMs": 744,
+ "repetitionsMs": [
+ 789,
+ 744,
+ 722
+ ],
+ "throughputTriplesPerSec": 479723,
+ "memoryBeforeMb": 45,
+ "memoryAfterMb": 181.97542857142855,
+ "memoryDeltaMb": 136.97542857142855,
+ "cpuPercent": 93,
+ "timeSeries": []
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "dbpedia",
+ "file": "persondata_en.nt",
+ "triples": 356914,
+ "loadingTimeMs": 1190,
+ "repetitionsMs": [
+ 1261,
+ 1190,
+ 1154
+ ],
+ "throughputTriplesPerSec": 299928,
+ "memoryBeforeMb": 45,
+ "memoryAfterMb": 181.97542857142855,
+ "memoryDeltaMb": 136.97542857142855,
+ "cpuPercent": 86,
+ "timeSeries": []
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "dbpedia",
+ "file": "persondata_en.nt",
+ "triples": 356914,
+ "loadingTimeMs": 632,
+ "repetitionsMs": [
+ 670,
+ 632,
+ 613
+ ],
+ "throughputTriplesPerSec": 564737,
+ "memoryBeforeMb": 45,
+ "memoryAfterMb": 181.97542857142855,
+ "memoryDeltaMb": 136.97542857142855,
+ "cpuPercent": 84,
+ "timeSeries": []
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "dbpedia",
+ "file": "persondata_en.nt",
+ "triples": 356914,
+ "loadingTimeMs": 1004,
+ "repetitionsMs": [
+ 1064,
+ 1004,
+ 974
+ ],
+ "throughputTriplesPerSec": 355492,
+ "memoryBeforeMb": 45,
+ "memoryAfterMb": 181.97542857142855,
+ "memoryDeltaMb": 136.97542857142855,
+ "cpuPercent": 88,
+ "timeSeries": []
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "dbpedia",
+ "file": "homepages_en.nt",
+ "triples": 394897,
+ "loadingTimeMs": 823,
+ "repetitionsMs": [
+ 872,
+ 823,
+ 798
+ ],
+ "throughputTriplesPerSec": 479826,
+ "memoryBeforeMb": 45,
+ "memoryAfterMb": 192.82771428571428,
+ "memoryDeltaMb": 147.82771428571428,
+ "cpuPercent": 83,
+ "timeSeries": []
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "dbpedia",
+ "file": "homepages_en.nt",
+ "triples": 394897,
+ "loadingTimeMs": 1316,
+ "repetitionsMs": [
+ 1395,
+ 1316,
+ 1277
+ ],
+ "throughputTriplesPerSec": 300074,
+ "memoryBeforeMb": 45,
+ "memoryAfterMb": 192.82771428571428,
+ "memoryDeltaMb": 147.82771428571428,
+ "cpuPercent": 82,
+ "timeSeries": []
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "dbpedia",
+ "file": "homepages_en.nt",
+ "triples": 394897,
+ "loadingTimeMs": 699,
+ "repetitionsMs": [
+ 741,
+ 699,
+ 678
+ ],
+ "throughputTriplesPerSec": 564946,
+ "memoryBeforeMb": 45,
+ "memoryAfterMb": 192.82771428571428,
+ "memoryDeltaMb": 147.82771428571428,
+ "cpuPercent": 86,
+ "timeSeries": []
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "dbpedia",
+ "file": "homepages_en.nt",
+ "triples": 394897,
+ "loadingTimeMs": 1111,
+ "repetitionsMs": [
+ 1178,
+ 1111,
+ 1078
+ ],
+ "throughputTriplesPerSec": 355443,
+ "memoryBeforeMb": 45,
+ "memoryAfterMb": 192.82771428571428,
+ "memoryDeltaMb": 147.82771428571428,
+ "cpuPercent": 90,
+ "timeSeries": []
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "dbpedia",
+ "file": "category_labels_en.nt",
+ "triples": 565108,
+ "loadingTimeMs": 1177,
+ "repetitionsMs": [
+ 1248,
+ 1177,
+ 1142
+ ],
+ "throughputTriplesPerSec": 480126,
+ "memoryBeforeMb": 45,
+ "memoryAfterMb": 241.45942857142856,
+ "memoryDeltaMb": 196.45942857142856,
+ "cpuPercent": 90,
+ "timeSeries": []
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "dbpedia",
+ "file": "category_labels_en.nt",
+ "triples": 565108,
+ "loadingTimeMs": 1884,
+ "repetitionsMs": [
+ 1997,
+ 1884,
+ 1827
+ ],
+ "throughputTriplesPerSec": 299951,
+ "memoryBeforeMb": 45,
+ "memoryAfterMb": 241.45942857142856,
+ "memoryDeltaMb": 196.45942857142856,
+ "cpuPercent": 91,
+ "timeSeries": []
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "dbpedia",
+ "file": "category_labels_en.nt",
+ "triples": 565108,
+ "loadingTimeMs": 1001,
+ "repetitionsMs": [
+ 1061,
+ 1001,
+ 971
+ ],
+ "throughputTriplesPerSec": 564543,
+ "memoryBeforeMb": 45,
+ "memoryAfterMb": 241.45942857142856,
+ "memoryDeltaMb": 196.45942857142856,
+ "cpuPercent": 89,
+ "timeSeries": []
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "dbpedia",
+ "file": "category_labels_en.nt",
+ "triples": 565108,
+ "loadingTimeMs": 1589,
+ "repetitionsMs": [
+ 1684,
+ 1589,
+ 1541
+ ],
+ "throughputTriplesPerSec": 355638,
+ "memoryBeforeMb": 45,
+ "memoryAfterMb": 241.45942857142856,
+ "memoryDeltaMb": 196.45942857142856,
+ "cpuPercent": 84,
+ "timeSeries": []
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "dbpedia",
+ "file": "disambiguations_en.nt",
+ "triples": 768924,
+ "loadingTimeMs": 1602,
+ "repetitionsMs": [
+ 1698,
+ 1602,
+ 1554
+ ],
+ "throughputTriplesPerSec": 479978,
+ "memoryBeforeMb": 45,
+ "memoryAfterMb": 299.69257142857145,
+ "memoryDeltaMb": 254.69257142857145,
+ "cpuPercent": 87,
+ "timeSeries": []
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "dbpedia",
+ "file": "disambiguations_en.nt",
+ "triples": 768924,
+ "loadingTimeMs": 2563,
+ "repetitionsMs": [
+ 2717,
+ 2563,
+ 2486
+ ],
+ "throughputTriplesPerSec": 300009,
+ "memoryBeforeMb": 45,
+ "memoryAfterMb": 299.69257142857145,
+ "memoryDeltaMb": 254.69257142857145,
+ "cpuPercent": 89,
+ "timeSeries": []
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "dbpedia",
+ "file": "disambiguations_en.nt",
+ "triples": 768924,
+ "loadingTimeMs": 1362,
+ "repetitionsMs": [
+ 1444,
+ 1362,
+ 1321
+ ],
+ "throughputTriplesPerSec": 564555,
+ "memoryBeforeMb": 45,
+ "memoryAfterMb": 299.69257142857145,
+ "memoryDeltaMb": 254.69257142857145,
+ "cpuPercent": 79,
+ "timeSeries": []
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "dbpedia",
+ "file": "disambiguations_en.nt",
+ "triples": 768924,
+ "loadingTimeMs": 2163,
+ "repetitionsMs": [
+ 2293,
+ 2163,
+ 2098
+ ],
+ "throughputTriplesPerSec": 355490,
+ "memoryBeforeMb": 45,
+ "memoryAfterMb": 299.69257142857145,
+ "memoryDeltaMb": 254.69257142857145,
+ "cpuPercent": 85,
+ "timeSeries": []
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "dbpedia",
+ "file": "specific_mappingbased_properties_en.nt",
+ "triples": 182530,
+ "loadingTimeMs": 380,
+ "repetitionsMs": [
+ 403,
+ 380,
+ 369
+ ],
+ "throughputTriplesPerSec": 480342,
+ "memoryBeforeMb": 45,
+ "memoryAfterMb": 132.15142857142857,
+ "memoryDeltaMb": 87.15142857142857,
+ "cpuPercent": 87,
+ "timeSeries": []
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "dbpedia",
+ "file": "specific_mappingbased_properties_en.nt",
+ "triples": 182530,
+ "loadingTimeMs": 608,
+ "repetitionsMs": [
+ 644,
+ 608,
+ 590
+ ],
+ "throughputTriplesPerSec": 300214,
+ "memoryBeforeMb": 45,
+ "memoryAfterMb": 132.15142857142857,
+ "memoryDeltaMb": 87.15142857142857,
+ "cpuPercent": 83,
+ "timeSeries": []
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "dbpedia",
+ "file": "specific_mappingbased_properties_en.nt",
+ "triples": 182530,
+ "loadingTimeMs": 323,
+ "repetitionsMs": [
+ 342,
+ 323,
+ 313
+ ],
+ "throughputTriplesPerSec": 565108,
+ "memoryBeforeMb": 45,
+ "memoryAfterMb": 132.15142857142857,
+ "memoryDeltaMb": 87.15142857142857,
+ "cpuPercent": 86,
+ "timeSeries": []
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "dbpedia",
+ "file": "specific_mappingbased_properties_en.nt",
+ "triples": 182530,
+ "loadingTimeMs": 513,
+ "repetitionsMs": [
+ 544,
+ 513,
+ 498
+ ],
+ "throughputTriplesPerSec": 355809,
+ "memoryBeforeMb": 45,
+ "memoryAfterMb": 132.15142857142857,
+ "memoryDeltaMb": 87.15142857142857,
+ "cpuPercent": 84,
+ "timeSeries": []
}
],
"queryRuns": [
@@ -119,9 +1114,38 @@
"queryId": "query_1",
"status": "PASS",
"medianMs": 8,
- "repetitionsMs": [12, 8, 7],
- "medianTtfrMs": 6,
- "repetitionsTtfrMs": [9, 6, 5],
+ "repetitionsMs": [
+ 9,
+ 8,
+ 8
+ ],
+ "medianTtfrMs": 1,
+ "repetitionsTtfrMs": [
+ 1,
+ 1,
+ 1
+ ],
+ "rowCount": 1,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "bowlogna",
+ "queryId": "query_1",
+ "status": "PASS",
+ "medianMs": 12,
+ "repetitionsMs": [
+ 13,
+ 12,
+ 12
+ ],
+ "medianTtfrMs": 1,
+ "repetitionsTtfrMs": [
+ 1,
+ 1,
+ 1
+ ],
"rowCount": 1,
"hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"errorMessage": null
@@ -132,9 +1156,17 @@
"queryId": "query_1",
"status": "PASS",
"medianMs": 9,
- "repetitionsMs": [14, 9, 8],
- "medianTtfrMs": 7,
- "repetitionsTtfrMs": [10, 7, 6],
+ "repetitionsMs": [
+ 10,
+ 9,
+ 9
+ ],
+ "medianTtfrMs": 1,
+ "repetitionsTtfrMs": [
+ 1,
+ 1,
+ 1
+ ],
"rowCount": 1,
"hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"errorMessage": null
@@ -145,9 +1177,17 @@
"queryId": "query_1",
"status": "PASS",
"medianMs": 11,
- "repetitionsMs": [16, 11, 10],
- "medianTtfrMs": 9,
- "repetitionsTtfrMs": [13, 9, 8],
+ "repetitionsMs": [
+ 12,
+ 11,
+ 11
+ ],
+ "medianTtfrMs": 1,
+ "repetitionsTtfrMs": [
+ 1,
+ 1,
+ 1
+ ],
"rowCount": 1,
"hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"errorMessage": null
@@ -155,80 +1195,3530 @@
{
"engine": "corese.next",
"dataset": "bowlogna",
- "queryId": "query_8",
+ "queryId": "query_2",
+ "status": "PASS",
+ "medianMs": 35,
+ "repetitionsMs": [
+ 38,
+ 35,
+ 34
+ ],
+ "medianTtfrMs": 4,
+ "repetitionsTtfrMs": [
+ 4,
+ 4,
+ 4
+ ],
+ "rowCount": 312,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "bowlogna",
+ "queryId": "query_2",
+ "status": "PASS",
+ "medianMs": 55,
+ "repetitionsMs": [
+ 59,
+ 55,
+ 53
+ ],
+ "medianTtfrMs": 7,
+ "repetitionsTtfrMs": [
+ 8,
+ 7,
+ 7
+ ],
+ "rowCount": 312,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "bowlogna",
+ "queryId": "query_2",
+ "status": "PASS",
+ "medianMs": 30,
+ "repetitionsMs": [
+ 32,
+ 30,
+ 29
+ ],
+ "medianTtfrMs": 4,
+ "repetitionsTtfrMs": [
+ 4,
+ 4,
+ 4
+ ],
+ "rowCount": 312,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "bowlogna",
+ "queryId": "query_2",
+ "status": "PASS",
+ "medianMs": 45,
+ "repetitionsMs": [
+ 49,
+ 45,
+ 44
+ ],
+ "medianTtfrMs": 5,
+ "repetitionsTtfrMs": [
+ 6,
+ 5,
+ 5
+ ],
+ "rowCount": 312,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "bowlogna",
+ "queryId": "query_3",
"status": "PASS",
"medianMs": 280,
- "repetitionsMs": [310, 280, 275],
- "medianTtfrMs": 15,
- "repetitionsTtfrMs": [20, 15, 14],
- "rowCount": 42,
- "hash": "8f3e2a0459a1c8996fb92427ae41e4649b934ca495991b7852b8554a7b9c1e11",
+ "repetitionsMs": [
+ 302,
+ 280,
+ 272
+ ],
+ "medianTtfrMs": 34,
+ "repetitionsTtfrMs": [
+ 37,
+ 34,
+ 32
+ ],
+ "rowCount": 980,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "bowlogna",
+ "queryId": "query_3",
+ "status": "PASS",
+ "medianMs": 420,
+ "repetitionsMs": [
+ 454,
+ 420,
+ 407
+ ],
+ "medianTtfrMs": 50,
+ "repetitionsTtfrMs": [
+ 55,
+ 50,
+ 48
+ ],
+ "rowCount": 980,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"errorMessage": null
},
{
"engine": "jena.6.2.0",
"dataset": "bowlogna",
- "queryId": "query_8",
+ "queryId": "query_3",
+ "status": "PASS",
+ "medianMs": 250,
+ "repetitionsMs": [
+ 270,
+ 250,
+ 243
+ ],
+ "medianTtfrMs": 30,
+ "repetitionsTtfrMs": [
+ 33,
+ 30,
+ 29
+ ],
+ "rowCount": 980,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "bowlogna",
+ "queryId": "query_3",
"status": "PASS",
"medianMs": 320,
- "repetitionsMs": [345, 320, 318],
- "medianTtfrMs": 45,
- "repetitionsTtfrMs": [50, 45, 43],
- "rowCount": 42,
- "hash": "8f3e2a0459a1c8996fb92427ae41e4649b934ca495991b7852b8554a7b9c1e11",
+ "repetitionsMs": [
+ 346,
+ 320,
+ 310
+ ],
+ "medianTtfrMs": 38,
+ "repetitionsTtfrMs": [
+ 42,
+ 38,
+ 36
+ ],
+ "rowCount": 980,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "bowlogna",
+ "queryId": "query_4",
+ "status": "PASS",
+ "medianMs": 190,
+ "repetitionsMs": [
+ 205,
+ 190,
+ 184
+ ],
+ "medianTtfrMs": 23,
+ "repetitionsTtfrMs": [
+ 25,
+ 23,
+ 22
+ ],
+ "rowCount": 452,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "bowlogna",
+ "queryId": "query_4",
+ "status": "PASS",
+ "medianMs": 290,
+ "repetitionsMs": [
+ 313,
+ 290,
+ 281
+ ],
+ "medianTtfrMs": 35,
+ "repetitionsTtfrMs": [
+ 39,
+ 35,
+ 33
+ ],
+ "rowCount": 452,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "bowlogna",
+ "queryId": "query_4",
+ "status": "PASS",
+ "medianMs": 170,
+ "repetitionsMs": [
+ 184,
+ 170,
+ 165
+ ],
+ "medianTtfrMs": 20,
+ "repetitionsTtfrMs": [
+ 22,
+ 20,
+ 19
+ ],
+ "rowCount": 452,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"errorMessage": null
},
{
"engine": "rdf4j.5.3.2",
"dataset": "bowlogna",
- "queryId": "query_8",
+ "queryId": "query_4",
"status": "PASS",
- "medianMs": 410,
- "repetitionsMs": [430, 410, 405],
- "medianTtfrMs": 60,
- "repetitionsTtfrMs": [65, 60, 58],
- "rowCount": 42,
- "hash": "8f3e2a0459a1c8996fb92427ae41e4649b934ca495991b7852b8554a7b9c1e11",
+ "medianMs": 210,
+ "repetitionsMs": [
+ 227,
+ 210,
+ 204
+ ],
+ "medianTtfrMs": 25,
+ "repetitionsTtfrMs": [
+ 28,
+ 25,
+ 24
+ ],
+ "rowCount": 452,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"errorMessage": null
},
{
"engine": "corese.next",
"dataset": "bowlogna",
- "queryId": "query_10",
+ "queryId": "query_5",
"status": "PASS",
- "medianMs": 45,
- "repetitionsMs": [50, 45, 44],
- "medianTtfrMs": 12,
- "repetitionsTtfrMs": [15, 12, 11],
- "rowCount": 1,
- "hash": "2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae",
+ "medianMs": 1200,
+ "repetitionsMs": [
+ 1296,
+ 1200,
+ 1164
+ ],
+ "medianTtfrMs": 144,
+ "repetitionsTtfrMs": [
+ 158,
+ 144,
+ 137
+ ],
+ "rowCount": 62,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "bowlogna",
+ "queryId": "query_5",
+ "status": "PASS",
+ "medianMs": 1850,
+ "repetitionsMs": [
+ 1998,
+ 1850,
+ 1795
+ ],
+ "medianTtfrMs": 222,
+ "repetitionsTtfrMs": [
+ 244,
+ 222,
+ 211
+ ],
+ "rowCount": 62,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"errorMessage": null
},
{
"engine": "jena.6.2.0",
"dataset": "bowlogna",
- "queryId": "query_10",
+ "queryId": "query_5",
"status": "PASS",
- "medianMs": 48,
- "repetitionsMs": [52, 48, 47],
- "medianTtfrMs": 14,
- "repetitionsTtfrMs": [17, 14, 13],
- "rowCount": 1,
- "hash": "2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae",
+ "medianMs": 900,
+ "repetitionsMs": [
+ 972,
+ 900,
+ 873
+ ],
+ "medianTtfrMs": 108,
+ "repetitionsTtfrMs": [
+ 119,
+ 108,
+ 103
+ ],
+ "rowCount": 62,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"errorMessage": null
},
{
"engine": "rdf4j.5.3.2",
"dataset": "bowlogna",
- "queryId": "query_10",
+ "queryId": "query_5",
+ "status": "PASS",
+ "medianMs": 1500,
+ "repetitionsMs": [
+ 1620,
+ 1500,
+ 1455
+ ],
+ "medianTtfrMs": 180,
+ "repetitionsTtfrMs": [
+ 198,
+ 180,
+ 171
+ ],
+ "rowCount": 62,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "bowlogna",
+ "queryId": "query_6",
+ "status": "PASS",
+ "medianMs": 95,
+ "repetitionsMs": [
+ 103,
+ 95,
+ 92
+ ],
+ "medianTtfrMs": 11,
+ "repetitionsTtfrMs": [
+ 12,
+ 11,
+ 10
+ ],
+ "rowCount": 145,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "bowlogna",
+ "queryId": "query_6",
+ "status": "PASS",
+ "medianMs": 140,
+ "repetitionsMs": [
+ 151,
+ 140,
+ 136
+ ],
+ "medianTtfrMs": 17,
+ "repetitionsTtfrMs": [
+ 19,
+ 17,
+ 16
+ ],
+ "rowCount": 145,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "bowlogna",
+ "queryId": "query_6",
+ "status": "PASS",
+ "medianMs": 80,
+ "repetitionsMs": [
+ 86,
+ 80,
+ 78
+ ],
+ "medianTtfrMs": 10,
+ "repetitionsTtfrMs": [
+ 11,
+ 10,
+ 10
+ ],
+ "rowCount": 145,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "bowlogna",
+ "queryId": "query_6",
+ "status": "PASS",
+ "medianMs": 110,
+ "repetitionsMs": [
+ 119,
+ 110,
+ 107
+ ],
+ "medianTtfrMs": 13,
+ "repetitionsTtfrMs": [
+ 14,
+ 13,
+ 12
+ ],
+ "rowCount": 145,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "bowlogna",
+ "queryId": "query_7",
+ "status": "PASS",
+ "medianMs": 420,
+ "repetitionsMs": [
+ 454,
+ 420,
+ 407
+ ],
+ "medianTtfrMs": 50,
+ "repetitionsTtfrMs": [
+ 55,
+ 50,
+ 48
+ ],
+ "rowCount": 88,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "bowlogna",
+ "queryId": "query_7",
+ "status": "PASS",
+ "medianMs": 650,
+ "repetitionsMs": [
+ 702,
+ 650,
+ 631
+ ],
+ "medianTtfrMs": 78,
+ "repetitionsTtfrMs": [
+ 86,
+ 78,
+ 74
+ ],
+ "rowCount": 88,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "bowlogna",
+ "queryId": "query_7",
+ "status": "PASS",
+ "medianMs": 350,
+ "repetitionsMs": [
+ 378,
+ 350,
+ 340
+ ],
+ "medianTtfrMs": 42,
+ "repetitionsTtfrMs": [
+ 46,
+ 42,
+ 40
+ ],
+ "rowCount": 88,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "bowlogna",
+ "queryId": "query_7",
+ "status": "PASS",
+ "medianMs": 480,
+ "repetitionsMs": [
+ 518,
+ 480,
+ 466
+ ],
+ "medianTtfrMs": 58,
+ "repetitionsTtfrMs": [
+ 64,
+ 58,
+ 55
+ ],
+ "rowCount": 88,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "bowlogna",
+ "queryId": "query_8",
+ "status": "PASS",
+ "medianMs": 280,
+ "repetitionsMs": [
+ 302,
+ 280,
+ 272
+ ],
+ "medianTtfrMs": 34,
+ "repetitionsTtfrMs": [
+ 37,
+ 34,
+ 32
+ ],
+ "rowCount": 42,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "bowlogna",
+ "queryId": "query_8",
+ "status": "TIMEOUT",
+ "medianMs": 60000,
+ "repetitionsMs": [
+ 64800,
+ 60000,
+ 58200
+ ],
+ "medianTtfrMs": -1,
+ "repetitionsTtfrMs": [
+ -1,
+ -1,
+ -1
+ ],
+ "rowCount": 0,
+ "hash": "",
+ "errorMessage": "Query execution exceeded timeout of 60000 ms"
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "bowlogna",
+ "queryId": "query_8",
+ "status": "PASS",
+ "medianMs": 320,
+ "repetitionsMs": [
+ 346,
+ 320,
+ 310
+ ],
+ "medianTtfrMs": 38,
+ "repetitionsTtfrMs": [
+ 42,
+ 38,
+ 36
+ ],
+ "rowCount": 42,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "bowlogna",
+ "queryId": "query_8",
+ "status": "PASS",
+ "medianMs": 410,
+ "repetitionsMs": [
+ 443,
+ 410,
+ 398
+ ],
+ "medianTtfrMs": 49,
+ "repetitionsTtfrMs": [
+ 54,
+ 49,
+ 47
+ ],
+ "rowCount": 42,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "bowlogna",
+ "queryId": "query_9",
+ "status": "PASS",
+ "medianMs": 265,
+ "repetitionsMs": [
+ 286,
+ 265,
+ 257
+ ],
+ "medianTtfrMs": 32,
+ "repetitionsTtfrMs": [
+ 35,
+ 32,
+ 30
+ ],
+ "rowCount": 42,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "bowlogna",
+ "queryId": "query_9",
+ "status": "TIMEOUT",
+ "medianMs": 60000,
+ "repetitionsMs": [
+ 64800,
+ 60000,
+ 58200
+ ],
+ "medianTtfrMs": -1,
+ "repetitionsTtfrMs": [
+ -1,
+ -1,
+ -1
+ ],
+ "rowCount": 0,
+ "hash": "",
+ "errorMessage": "Query execution exceeded timeout of 60000 ms"
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "bowlogna",
+ "queryId": "query_9",
+ "status": "PASS",
+ "medianMs": 305,
+ "repetitionsMs": [
+ 329,
+ 305,
+ 296
+ ],
+ "medianTtfrMs": 37,
+ "repetitionsTtfrMs": [
+ 41,
+ 37,
+ 35
+ ],
+ "rowCount": 42,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "bowlogna",
+ "queryId": "query_9",
+ "status": "PASS",
+ "medianMs": 390,
+ "repetitionsMs": [
+ 421,
+ 390,
+ 378
+ ],
+ "medianTtfrMs": 47,
+ "repetitionsTtfrMs": [
+ 52,
+ 47,
+ 45
+ ],
+ "rowCount": 42,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "bowlogna",
+ "queryId": "query_10",
+ "status": "PASS",
+ "medianMs": 45,
+ "repetitionsMs": [
+ 49,
+ 45,
+ 44
+ ],
+ "medianTtfrMs": 5,
+ "repetitionsTtfrMs": [
+ 6,
+ 5,
+ 5
+ ],
+ "rowCount": 1,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "bowlogna",
+ "queryId": "query_10",
+ "status": "PASS",
+ "medianMs": 72,
+ "repetitionsMs": [
+ 78,
+ 72,
+ 70
+ ],
+ "medianTtfrMs": 9,
+ "repetitionsTtfrMs": [
+ 10,
+ 9,
+ 9
+ ],
+ "rowCount": 1,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "bowlogna",
+ "queryId": "query_10",
+ "status": "PASS",
+ "medianMs": 48,
+ "repetitionsMs": [
+ 52,
+ 48,
+ 47
+ ],
+ "medianTtfrMs": 6,
+ "repetitionsTtfrMs": [
+ 7,
+ 6,
+ 6
+ ],
+ "rowCount": 1,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "bowlogna",
+ "queryId": "query_10",
+ "status": "TIMEOUT",
+ "medianMs": 60000,
+ "repetitionsMs": [
+ 64800,
+ 60000,
+ 58200
+ ],
+ "medianTtfrMs": -1,
+ "repetitionsTtfrMs": [
+ -1,
+ -1,
+ -1
+ ],
+ "rowCount": 0,
+ "hash": "",
+ "errorMessage": "Query execution exceeded timeout of 60000 ms"
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "bowlogna",
+ "queryId": "query_11",
+ "status": "PASS",
+ "medianMs": 310,
+ "repetitionsMs": [
+ 335,
+ 310,
+ 301
+ ],
+ "medianTtfrMs": 37,
+ "repetitionsTtfrMs": [
+ 41,
+ 37,
+ 35
+ ],
+ "rowCount": 5,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "bowlogna",
+ "queryId": "query_11",
+ "status": "TIMEOUT",
+ "medianMs": 60000,
+ "repetitionsMs": [
+ 64800,
+ 60000,
+ 58200
+ ],
+ "medianTtfrMs": -1,
+ "repetitionsTtfrMs": [
+ -1,
+ -1,
+ -1
+ ],
+ "rowCount": 0,
+ "hash": "",
+ "errorMessage": "Query execution exceeded timeout of 60000 ms"
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "bowlogna",
+ "queryId": "query_11",
+ "status": "PASS",
+ "medianMs": 290,
+ "repetitionsMs": [
+ 313,
+ 290,
+ 281
+ ],
+ "medianTtfrMs": 35,
+ "repetitionsTtfrMs": [
+ 39,
+ 35,
+ 33
+ ],
+ "rowCount": 5,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "bowlogna",
+ "queryId": "query_11",
+ "status": "TIMEOUT",
+ "medianMs": 60000,
+ "repetitionsMs": [
+ 64800,
+ 60000,
+ 58200
+ ],
+ "medianTtfrMs": -1,
+ "repetitionsTtfrMs": [
+ -1,
+ -1,
+ -1
+ ],
+ "rowCount": 0,
+ "hash": "",
+ "errorMessage": "Query execution exceeded timeout of 60000 ms"
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "bowlogna",
+ "queryId": "query_12",
+ "status": "PASS",
+ "medianMs": 185,
+ "repetitionsMs": [
+ 200,
+ 185,
+ 179
+ ],
+ "medianTtfrMs": 22,
+ "repetitionsTtfrMs": [
+ 24,
+ 22,
+ 21
+ ],
+ "rowCount": 18,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "bowlogna",
+ "queryId": "query_12",
+ "status": "PASS",
+ "medianMs": 280,
+ "repetitionsMs": [
+ 302,
+ 280,
+ 272
+ ],
+ "medianTtfrMs": 34,
+ "repetitionsTtfrMs": [
+ 37,
+ 34,
+ 32
+ ],
+ "rowCount": 18,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "bowlogna",
+ "queryId": "query_12",
+ "status": "PASS",
+ "medianMs": 170,
+ "repetitionsMs": [
+ 184,
+ 170,
+ 165
+ ],
+ "medianTtfrMs": 20,
+ "repetitionsTtfrMs": [
+ 22,
+ 20,
+ 19
+ ],
+ "rowCount": 18,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "bowlogna",
+ "queryId": "query_12",
+ "status": "PASS",
+ "medianMs": 220,
+ "repetitionsMs": [
+ 238,
+ 220,
+ 213
+ ],
+ "medianTtfrMs": 26,
+ "repetitionsTtfrMs": [
+ 29,
+ 26,
+ 25
+ ],
+ "rowCount": 18,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "bowlogna",
+ "queryId": "query_13",
+ "status": "PASS",
+ "medianMs": 22,
+ "repetitionsMs": [
+ 24,
+ 22,
+ 21
+ ],
+ "medianTtfrMs": 3,
+ "repetitionsTtfrMs": [
+ 3,
+ 3,
+ 3
+ ],
+ "rowCount": 1,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "bowlogna",
+ "queryId": "query_13",
+ "status": "PASS",
+ "medianMs": 35,
+ "repetitionsMs": [
+ 38,
+ 35,
+ 34
+ ],
+ "medianTtfrMs": 4,
+ "repetitionsTtfrMs": [
+ 4,
+ 4,
+ 4
+ ],
+ "rowCount": 1,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "bowlogna",
+ "queryId": "query_13",
+ "status": "PASS",
+ "medianMs": 19,
+ "repetitionsMs": [
+ 21,
+ 19,
+ 18
+ ],
+ "medianTtfrMs": 2,
+ "repetitionsTtfrMs": [
+ 2,
+ 2,
+ 2
+ ],
+ "rowCount": 1,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "bowlogna",
+ "queryId": "query_13",
+ "status": "PASS",
+ "medianMs": 28,
+ "repetitionsMs": [
+ 30,
+ 28,
+ 27
+ ],
+ "medianTtfrMs": 3,
+ "repetitionsTtfrMs": [
+ 3,
+ 3,
+ 3
+ ],
+ "rowCount": 1,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "bowlogna",
+ "queryId": "query_14",
+ "status": "PASS",
+ "medianMs": 650,
+ "repetitionsMs": [
+ 702,
+ 650,
+ 631
+ ],
+ "medianTtfrMs": 78,
+ "repetitionsTtfrMs": [
+ 86,
+ 78,
+ 74
+ ],
+ "rowCount": 28,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "bowlogna",
+ "queryId": "query_14",
+ "status": "PASS",
+ "medianMs": 980,
+ "repetitionsMs": [
+ 1058,
+ 980,
+ 951
+ ],
+ "medianTtfrMs": 118,
+ "repetitionsTtfrMs": [
+ 130,
+ 118,
+ 112
+ ],
+ "rowCount": 28,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "bowlogna",
+ "queryId": "query_14",
+ "status": "PASS",
+ "medianMs": 520,
+ "repetitionsMs": [
+ 562,
+ 520,
+ 504
+ ],
+ "medianTtfrMs": 62,
+ "repetitionsTtfrMs": [
+ 68,
+ 62,
+ 59
+ ],
+ "rowCount": 28,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "bowlogna",
+ "queryId": "query_14",
+ "status": "PASS",
+ "medianMs": 780,
+ "repetitionsMs": [
+ 842,
+ 780,
+ 757
+ ],
+ "medianTtfrMs": 94,
+ "repetitionsTtfrMs": [
+ 103,
+ 94,
+ 89
+ ],
+ "rowCount": 28,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "bowlogna",
+ "queryId": "query_15",
+ "status": "PASS",
+ "medianMs": 12,
+ "repetitionsMs": [
+ 13,
+ 12,
+ 12
+ ],
+ "medianTtfrMs": 1,
+ "repetitionsTtfrMs": [
+ 1,
+ 1,
+ 1
+ ],
+ "rowCount": 7,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "bowlogna",
+ "queryId": "query_15",
+ "status": "PASS",
+ "medianMs": 18,
+ "repetitionsMs": [
+ 19,
+ 18,
+ 17
+ ],
+ "medianTtfrMs": 2,
+ "repetitionsTtfrMs": [
+ 2,
+ 2,
+ 2
+ ],
+ "rowCount": 7,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "bowlogna",
+ "queryId": "query_15",
+ "status": "PASS",
+ "medianMs": 11,
+ "repetitionsMs": [
+ 12,
+ 11,
+ 11
+ ],
+ "medianTtfrMs": 1,
+ "repetitionsTtfrMs": [
+ 1,
+ 1,
+ 1
+ ],
+ "rowCount": 7,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "bowlogna",
+ "queryId": "query_15",
+ "status": "PASS",
+ "medianMs": 15,
+ "repetitionsMs": [
+ 16,
+ 15,
+ 15
+ ],
+ "medianTtfrMs": 2,
+ "repetitionsTtfrMs": [
+ 2,
+ 2,
+ 2
+ ],
+ "rowCount": 7,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "bowlogna",
+ "queryId": "query_16",
+ "status": "PASS",
+ "medianMs": 350,
+ "repetitionsMs": [
+ 378,
+ 350,
+ 340
+ ],
+ "medianTtfrMs": 42,
+ "repetitionsTtfrMs": [
+ 46,
+ 42,
+ 40
+ ],
+ "rowCount": 220,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "bowlogna",
+ "queryId": "query_16",
+ "status": "TIMEOUT",
+ "medianMs": 60000,
+ "repetitionsMs": [
+ 64800,
+ 60000,
+ 58200
+ ],
+ "medianTtfrMs": -1,
+ "repetitionsTtfrMs": [
+ -1,
+ -1,
+ -1
+ ],
+ "rowCount": 0,
+ "hash": "",
+ "errorMessage": "Query execution exceeded timeout of 60000 ms"
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "bowlogna",
+ "queryId": "query_16",
+ "status": "PASS",
+ "medianMs": 320,
+ "repetitionsMs": [
+ 346,
+ 320,
+ 310
+ ],
+ "medianTtfrMs": 38,
+ "repetitionsTtfrMs": [
+ 42,
+ 38,
+ 36
+ ],
+ "rowCount": 220,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "bowlogna",
+ "queryId": "query_16",
+ "status": "TIMEOUT",
+ "medianMs": 60000,
+ "repetitionsMs": [
+ 64800,
+ 60000,
+ 58200
+ ],
+ "medianTtfrMs": -1,
+ "repetitionsTtfrMs": [
+ -1,
+ -1,
+ -1
+ ],
+ "rowCount": 0,
+ "hash": "",
+ "errorMessage": "Query execution exceeded timeout of 60000 ms"
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "bowlogna",
+ "queryId": "query_17",
+ "status": "PASS",
+ "medianMs": 340,
+ "repetitionsMs": [
+ 367,
+ 340,
+ 330
+ ],
+ "medianTtfrMs": 41,
+ "repetitionsTtfrMs": [
+ 45,
+ 41,
+ 39
+ ],
+ "rowCount": 195,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "bowlogna",
+ "queryId": "query_17",
+ "status": "TIMEOUT",
+ "medianMs": 60000,
+ "repetitionsMs": [
+ 64800,
+ 60000,
+ 58200
+ ],
+ "medianTtfrMs": -1,
+ "repetitionsTtfrMs": [
+ -1,
+ -1,
+ -1
+ ],
+ "rowCount": 0,
+ "hash": "",
+ "errorMessage": "Query execution exceeded timeout of 60000 ms"
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "bowlogna",
+ "queryId": "query_17",
+ "status": "PASS",
+ "medianMs": 310,
+ "repetitionsMs": [
+ 335,
+ 310,
+ 301
+ ],
+ "medianTtfrMs": 37,
+ "repetitionsTtfrMs": [
+ 41,
+ 37,
+ 35
+ ],
+ "rowCount": 195,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "bowlogna",
+ "queryId": "query_17",
+ "status": "TIMEOUT",
+ "medianMs": 60000,
+ "repetitionsMs": [
+ 64800,
+ 60000,
+ 58200
+ ],
+ "medianTtfrMs": -1,
+ "repetitionsTtfrMs": [
+ -1,
+ -1,
+ -1
+ ],
+ "rowCount": 0,
+ "hash": "",
+ "errorMessage": "Query execution exceeded timeout of 60000 ms"
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "bsbm",
+ "queryId": "query_1",
+ "status": "PASS",
+ "medianMs": 42,
+ "repetitionsMs": [
+ 45,
+ 42,
+ 41
+ ],
+ "medianTtfrMs": 5,
+ "repetitionsTtfrMs": [
+ 6,
+ 5,
+ 5
+ ],
+ "rowCount": 10,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "bsbm",
+ "queryId": "query_1",
+ "status": "PASS",
+ "medianMs": 68,
+ "repetitionsMs": [
+ 73,
+ 68,
+ 66
+ ],
+ "medianTtfrMs": 8,
+ "repetitionsTtfrMs": [
+ 9,
+ 8,
+ 8
+ ],
+ "rowCount": 10,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "bsbm",
+ "queryId": "query_1",
+ "status": "PASS",
+ "medianMs": 38,
+ "repetitionsMs": [
+ 41,
+ 38,
+ 37
+ ],
+ "medianTtfrMs": 5,
+ "repetitionsTtfrMs": [
+ 6,
+ 5,
+ 5
+ ],
+ "rowCount": 10,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "bsbm",
+ "queryId": "query_1",
+ "status": "PASS",
+ "medianMs": 55,
+ "repetitionsMs": [
+ 59,
+ 55,
+ 53
+ ],
+ "medianTtfrMs": 7,
+ "repetitionsTtfrMs": [
+ 8,
+ 7,
+ 7
+ ],
+ "rowCount": 10,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "bsbm",
+ "queryId": "query_2",
+ "status": "PASS",
+ "medianMs": 8,
+ "repetitionsMs": [
+ 9,
+ 8,
+ 8
+ ],
+ "medianTtfrMs": 1,
+ "repetitionsTtfrMs": [
+ 1,
+ 1,
+ 1
+ ],
+ "rowCount": 1,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "bsbm",
+ "queryId": "query_2",
+ "status": "PASS",
+ "medianMs": 13,
+ "repetitionsMs": [
+ 14,
+ 13,
+ 13
+ ],
+ "medianTtfrMs": 2,
+ "repetitionsTtfrMs": [
+ 2,
+ 2,
+ 2
+ ],
+ "rowCount": 1,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "bsbm",
+ "queryId": "query_2",
+ "status": "PASS",
+ "medianMs": 7,
+ "repetitionsMs": [
+ 8,
+ 7,
+ 7
+ ],
+ "medianTtfrMs": 1,
+ "repetitionsTtfrMs": [
+ 1,
+ 1,
+ 1
+ ],
+ "rowCount": 1,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "bsbm",
+ "queryId": "query_2",
+ "status": "PASS",
+ "medianMs": 10,
+ "repetitionsMs": [
+ 11,
+ 10,
+ 10
+ ],
+ "medianTtfrMs": 1,
+ "repetitionsTtfrMs": [
+ 1,
+ 1,
+ 1
+ ],
+ "rowCount": 1,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "bsbm",
+ "queryId": "query_3",
+ "status": "PASS",
+ "medianMs": 65,
+ "repetitionsMs": [
+ 70,
+ 65,
+ 63
+ ],
+ "medianTtfrMs": 8,
+ "repetitionsTtfrMs": [
+ 9,
+ 8,
+ 8
+ ],
+ "rowCount": 10,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "bsbm",
+ "queryId": "query_3",
+ "status": "PASS",
+ "medianMs": 98,
+ "repetitionsMs": [
+ 106,
+ 98,
+ 95
+ ],
+ "medianTtfrMs": 12,
+ "repetitionsTtfrMs": [
+ 13,
+ 12,
+ 11
+ ],
+ "rowCount": 10,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "bsbm",
+ "queryId": "query_3",
+ "status": "PASS",
+ "medianMs": 58,
+ "repetitionsMs": [
+ 63,
+ 58,
+ 56
+ ],
+ "medianTtfrMs": 7,
+ "repetitionsTtfrMs": [
+ 8,
+ 7,
+ 7
+ ],
+ "rowCount": 10,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "bsbm",
+ "queryId": "query_3",
+ "status": "PASS",
+ "medianMs": 80,
+ "repetitionsMs": [
+ 86,
+ 80,
+ 78
+ ],
+ "medianTtfrMs": 10,
+ "repetitionsTtfrMs": [
+ 11,
+ 10,
+ 10
+ ],
+ "rowCount": 10,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "bsbm",
+ "queryId": "query_4",
+ "status": "PASS",
+ "medianMs": 120,
+ "repetitionsMs": [
+ 130,
+ 120,
+ 116
+ ],
+ "medianTtfrMs": 14,
+ "repetitionsTtfrMs": [
+ 15,
+ 14,
+ 13
+ ],
+ "rowCount": 10,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "bsbm",
+ "queryId": "query_4",
+ "status": "PASS",
+ "medianMs": 185,
+ "repetitionsMs": [
+ 200,
+ 185,
+ 179
+ ],
+ "medianTtfrMs": 22,
+ "repetitionsTtfrMs": [
+ 24,
+ 22,
+ 21
+ ],
+ "rowCount": 10,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "bsbm",
+ "queryId": "query_4",
+ "status": "PASS",
+ "medianMs": 105,
+ "repetitionsMs": [
+ 113,
+ 105,
+ 102
+ ],
+ "medianTtfrMs": 13,
+ "repetitionsTtfrMs": [
+ 14,
+ 13,
+ 12
+ ],
+ "rowCount": 10,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "bsbm",
+ "queryId": "query_4",
+ "status": "PASS",
+ "medianMs": 145,
+ "repetitionsMs": [
+ 157,
+ 145,
+ 141
+ ],
+ "medianTtfrMs": 17,
+ "repetitionsTtfrMs": [
+ 19,
+ 17,
+ 16
+ ],
+ "rowCount": 10,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "bsbm",
+ "queryId": "query_5",
+ "status": "PASS",
+ "medianMs": 380,
+ "repetitionsMs": [
+ 410,
+ 380,
+ 369
+ ],
+ "medianTtfrMs": 46,
+ "repetitionsTtfrMs": [
+ 51,
+ 46,
+ 44
+ ],
+ "rowCount": 5,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "bsbm",
+ "queryId": "query_5",
+ "status": "PASS",
+ "medianMs": 590,
+ "repetitionsMs": [
+ 637,
+ 590,
+ 572
+ ],
+ "medianTtfrMs": 71,
+ "repetitionsTtfrMs": [
+ 78,
+ 71,
+ 67
+ ],
+ "rowCount": 5,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "bsbm",
+ "queryId": "query_5",
+ "status": "PASS",
+ "medianMs": 310,
+ "repetitionsMs": [
+ 335,
+ 310,
+ 301
+ ],
+ "medianTtfrMs": 37,
+ "repetitionsTtfrMs": [
+ 41,
+ 37,
+ 35
+ ],
+ "rowCount": 5,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "bsbm",
+ "queryId": "query_5",
+ "status": "PASS",
+ "medianMs": 450,
+ "repetitionsMs": [
+ 486,
+ 450,
+ 437
+ ],
+ "medianTtfrMs": 54,
+ "repetitionsTtfrMs": [
+ 59,
+ 54,
+ 51
+ ],
+ "rowCount": 5,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "bsbm",
+ "queryId": "query_6",
+ "status": "PASS",
+ "medianMs": 28,
+ "repetitionsMs": [
+ 30,
+ 28,
+ 27
+ ],
+ "medianTtfrMs": 3,
+ "repetitionsTtfrMs": [
+ 3,
+ 3,
+ 3
+ ],
+ "rowCount": 10,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "bsbm",
+ "queryId": "query_6",
+ "status": "PASS",
+ "medianMs": 44,
+ "repetitionsMs": [
+ 48,
+ 44,
+ 43
+ ],
+ "medianTtfrMs": 5,
+ "repetitionsTtfrMs": [
+ 6,
+ 5,
+ 5
+ ],
+ "rowCount": 10,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "bsbm",
+ "queryId": "query_6",
+ "status": "PASS",
+ "medianMs": 25,
+ "repetitionsMs": [
+ 27,
+ 25,
+ 24
+ ],
+ "medianTtfrMs": 3,
+ "repetitionsTtfrMs": [
+ 3,
+ 3,
+ 3
+ ],
+ "rowCount": 10,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "bsbm",
+ "queryId": "query_6",
+ "status": "PASS",
+ "medianMs": 35,
+ "repetitionsMs": [
+ 38,
+ 35,
+ 34
+ ],
+ "medianTtfrMs": 4,
+ "repetitionsTtfrMs": [
+ 4,
+ 4,
+ 4
+ ],
+ "rowCount": 10,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "bsbm",
+ "queryId": "query_7",
+ "status": "PASS",
+ "medianMs": 52,
+ "repetitionsMs": [
+ 56,
+ 52,
+ 50
+ ],
+ "medianTtfrMs": 6,
+ "repetitionsTtfrMs": [
+ 7,
+ 6,
+ 6
+ ],
+ "rowCount": 10,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "bsbm",
+ "queryId": "query_7",
+ "status": "PASS",
+ "medianMs": 80,
+ "repetitionsMs": [
+ 86,
+ 80,
+ 78
+ ],
+ "medianTtfrMs": 10,
+ "repetitionsTtfrMs": [
+ 11,
+ 10,
+ 10
+ ],
+ "rowCount": 10,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "bsbm",
+ "queryId": "query_7",
+ "status": "PASS",
+ "medianMs": 45,
+ "repetitionsMs": [
+ 49,
+ 45,
+ 44
+ ],
+ "medianTtfrMs": 5,
+ "repetitionsTtfrMs": [
+ 6,
+ 5,
+ 5
+ ],
+ "rowCount": 10,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "bsbm",
+ "queryId": "query_7",
+ "status": "PASS",
+ "medianMs": 65,
+ "repetitionsMs": [
+ 70,
+ 65,
+ 63
+ ],
+ "medianTtfrMs": 8,
+ "repetitionsTtfrMs": [
+ 9,
+ 8,
+ 8
+ ],
+ "rowCount": 10,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "bsbm",
+ "queryId": "query_8",
+ "status": "PASS",
+ "medianMs": 15,
+ "repetitionsMs": [
+ 16,
+ 15,
+ 15
+ ],
+ "medianTtfrMs": 2,
+ "repetitionsTtfrMs": [
+ 2,
+ 2,
+ 2
+ ],
+ "rowCount": 1,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "bsbm",
+ "queryId": "query_8",
+ "status": "PASS",
+ "medianMs": 23,
+ "repetitionsMs": [
+ 25,
+ 23,
+ 22
+ ],
+ "medianTtfrMs": 3,
+ "repetitionsTtfrMs": [
+ 3,
+ 3,
+ 3
+ ],
+ "rowCount": 1,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "bsbm",
+ "queryId": "query_8",
+ "status": "PASS",
+ "medianMs": 13,
+ "repetitionsMs": [
+ 14,
+ 13,
+ 13
+ ],
+ "medianTtfrMs": 2,
+ "repetitionsTtfrMs": [
+ 2,
+ 2,
+ 2
+ ],
+ "rowCount": 1,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "bsbm",
+ "queryId": "query_8",
+ "status": "PASS",
+ "medianMs": 18,
+ "repetitionsMs": [
+ 19,
+ 18,
+ 17
+ ],
+ "medianTtfrMs": 2,
+ "repetitionsTtfrMs": [
+ 2,
+ 2,
+ 2
+ ],
+ "rowCount": 1,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "bsbm",
+ "queryId": "query_9",
+ "status": "PASS",
+ "medianMs": 95,
+ "repetitionsMs": [
+ 103,
+ 95,
+ 92
+ ],
+ "medianTtfrMs": 11,
+ "repetitionsTtfrMs": [
+ 12,
+ 11,
+ 10
+ ],
+ "rowCount": 10,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "bsbm",
+ "queryId": "query_9",
+ "status": "PASS",
+ "medianMs": 145,
+ "repetitionsMs": [
+ 157,
+ 145,
+ 141
+ ],
+ "medianTtfrMs": 17,
+ "repetitionsTtfrMs": [
+ 19,
+ 17,
+ 16
+ ],
+ "rowCount": 10,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "bsbm",
+ "queryId": "query_9",
+ "status": "PASS",
+ "medianMs": 85,
+ "repetitionsMs": [
+ 92,
+ 85,
+ 82
+ ],
+ "medianTtfrMs": 10,
+ "repetitionsTtfrMs": [
+ 11,
+ 10,
+ 10
+ ],
+ "rowCount": 10,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "bsbm",
+ "queryId": "query_9",
+ "status": "PASS",
+ "medianMs": 115,
+ "repetitionsMs": [
+ 124,
+ 115,
+ 112
+ ],
+ "medianTtfrMs": 14,
+ "repetitionsTtfrMs": [
+ 15,
+ 14,
+ 13
+ ],
+ "rowCount": 10,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "bsbm",
+ "queryId": "query_10",
+ "status": "PASS",
+ "medianMs": 45,
+ "repetitionsMs": [
+ 49,
+ 45,
+ 44
+ ],
+ "medianTtfrMs": 5,
+ "repetitionsTtfrMs": [
+ 6,
+ 5,
+ 5
+ ],
+ "rowCount": 10,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "bsbm",
+ "queryId": "query_10",
+ "status": "PASS",
+ "medianMs": 70,
+ "repetitionsMs": [
+ 76,
+ 70,
+ 68
+ ],
+ "medianTtfrMs": 8,
+ "repetitionsTtfrMs": [
+ 9,
+ 8,
+ 8
+ ],
+ "rowCount": 10,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "bsbm",
+ "queryId": "query_10",
+ "status": "PASS",
+ "medianMs": 40,
+ "repetitionsMs": [
+ 43,
+ 40,
+ 39
+ ],
+ "medianTtfrMs": 5,
+ "repetitionsTtfrMs": [
+ 6,
+ 5,
+ 5
+ ],
+ "rowCount": 10,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "bsbm",
+ "queryId": "query_10",
+ "status": "PASS",
+ "medianMs": 58,
+ "repetitionsMs": [
+ 63,
+ 58,
+ 56
+ ],
+ "medianTtfrMs": 7,
+ "repetitionsTtfrMs": [
+ 8,
+ 7,
+ 7
+ ],
+ "rowCount": 10,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "bsbm",
+ "queryId": "query_11",
+ "status": "PASS",
+ "medianMs": 75,
+ "repetitionsMs": [
+ 81,
+ 75,
+ 73
+ ],
+ "medianTtfrMs": 9,
+ "repetitionsTtfrMs": [
+ 10,
+ 9,
+ 9
+ ],
+ "rowCount": 10,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "bsbm",
+ "queryId": "query_11",
+ "status": "PASS",
+ "medianMs": 115,
+ "repetitionsMs": [
+ 124,
+ 115,
+ 112
+ ],
+ "medianTtfrMs": 14,
+ "repetitionsTtfrMs": [
+ 15,
+ 14,
+ 13
+ ],
+ "rowCount": 10,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "bsbm",
+ "queryId": "query_11",
+ "status": "PASS",
+ "medianMs": 68,
+ "repetitionsMs": [
+ 73,
+ 68,
+ 66
+ ],
+ "medianTtfrMs": 8,
+ "repetitionsTtfrMs": [
+ 9,
+ 8,
+ 8
+ ],
+ "rowCount": 10,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "bsbm",
+ "queryId": "query_11",
+ "status": "PASS",
+ "medianMs": 92,
+ "repetitionsMs": [
+ 99,
+ 92,
+ 89
+ ],
+ "medianTtfrMs": 11,
+ "repetitionsTtfrMs": [
+ 12,
+ 11,
+ 10
+ ],
+ "rowCount": 10,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "bsbm",
+ "queryId": "query_12",
+ "status": "TIMEOUT",
+ "medianMs": 60000,
+ "repetitionsMs": [
+ 64800,
+ 60000,
+ 58200
+ ],
+ "medianTtfrMs": -1,
+ "repetitionsTtfrMs": [
+ -1,
+ -1,
+ -1
+ ],
+ "rowCount": 0,
+ "hash": "",
+ "errorMessage": "Query execution exceeded timeout of 60000 ms"
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "bsbm",
+ "queryId": "query_12",
+ "status": "TIMEOUT",
+ "medianMs": 60000,
+ "repetitionsMs": [
+ 64800,
+ 60000,
+ 58200
+ ],
+ "medianTtfrMs": -1,
+ "repetitionsTtfrMs": [
+ -1,
+ -1,
+ -1
+ ],
+ "rowCount": 0,
+ "hash": "",
+ "errorMessage": "Query execution exceeded timeout of 60000 ms"
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "bsbm",
+ "queryId": "query_12",
+ "status": "PASS",
+ "medianMs": 280,
+ "repetitionsMs": [
+ 302,
+ 280,
+ 272
+ ],
+ "medianTtfrMs": 34,
+ "repetitionsTtfrMs": [
+ 37,
+ 34,
+ 32
+ ],
+ "rowCount": 5,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "bsbm",
+ "queryId": "query_12",
+ "status": "TIMEOUT",
+ "medianMs": 60000,
+ "repetitionsMs": [
+ 64800,
+ 60000,
+ 58200
+ ],
+ "medianTtfrMs": -1,
+ "repetitionsTtfrMs": [
+ -1,
+ -1,
+ -1
+ ],
+ "rowCount": 0,
+ "hash": "",
+ "errorMessage": "Query execution exceeded timeout of 60000 ms"
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "lubm",
+ "queryId": "query_1",
+ "status": "PASS",
+ "medianMs": 12,
+ "repetitionsMs": [
+ 13,
+ 12,
+ 12
+ ],
+ "medianTtfrMs": 1,
+ "repetitionsTtfrMs": [
+ 1,
+ 1,
+ 1
+ ],
+ "rowCount": 4,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "lubm",
+ "queryId": "query_1",
+ "status": "PASS",
+ "medianMs": 18,
+ "repetitionsMs": [
+ 19,
+ 18,
+ 17
+ ],
+ "medianTtfrMs": 2,
+ "repetitionsTtfrMs": [
+ 2,
+ 2,
+ 2
+ ],
+ "rowCount": 4,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "lubm",
+ "queryId": "query_1",
+ "status": "PASS",
+ "medianMs": 10,
+ "repetitionsMs": [
+ 11,
+ 10,
+ 10
+ ],
+ "medianTtfrMs": 1,
+ "repetitionsTtfrMs": [
+ 1,
+ 1,
+ 1
+ ],
+ "rowCount": 4,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "lubm",
+ "queryId": "query_1",
+ "status": "PASS",
+ "medianMs": 15,
+ "repetitionsMs": [
+ 16,
+ 15,
+ 15
+ ],
+ "medianTtfrMs": 2,
+ "repetitionsTtfrMs": [
+ 2,
+ 2,
+ 2
+ ],
+ "rowCount": 4,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "lubm",
+ "queryId": "query_2",
+ "status": "PASS",
+ "medianMs": 450,
+ "repetitionsMs": [
+ 486,
+ 450,
+ 437
+ ],
+ "medianTtfrMs": 54,
+ "repetitionsTtfrMs": [
+ 59,
+ 54,
+ 51
+ ],
+ "rowCount": 2348,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "lubm",
+ "queryId": "query_2",
+ "status": "PASS",
+ "medianMs": 720,
+ "repetitionsMs": [
+ 778,
+ 720,
+ 698
+ ],
+ "medianTtfrMs": 86,
+ "repetitionsTtfrMs": [
+ 95,
+ 86,
+ 82
+ ],
+ "rowCount": 2348,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "lubm",
+ "queryId": "query_2",
+ "status": "PASS",
+ "medianMs": 380,
+ "repetitionsMs": [
+ 410,
+ 380,
+ 369
+ ],
+ "medianTtfrMs": 46,
+ "repetitionsTtfrMs": [
+ 51,
+ 46,
+ 44
+ ],
+ "rowCount": 2348,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "lubm",
+ "queryId": "query_2",
+ "status": "TIMEOUT",
+ "medianMs": 60000,
+ "repetitionsMs": [
+ 64800,
+ 60000,
+ 58200
+ ],
+ "medianTtfrMs": -1,
+ "repetitionsTtfrMs": [
+ -1,
+ -1,
+ -1
+ ],
+ "rowCount": 0,
+ "hash": "",
+ "errorMessage": "Query execution exceeded timeout of 60000 ms"
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "lubm",
+ "queryId": "query_3",
+ "status": "PASS",
+ "medianMs": 8,
+ "repetitionsMs": [
+ 9,
+ 8,
+ 8
+ ],
+ "medianTtfrMs": 1,
+ "repetitionsTtfrMs": [
+ 1,
+ 1,
+ 1
+ ],
+ "rowCount": 6,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "lubm",
+ "queryId": "query_3",
+ "status": "PASS",
+ "medianMs": 12,
+ "repetitionsMs": [
+ 13,
+ 12,
+ 12
+ ],
+ "medianTtfrMs": 1,
+ "repetitionsTtfrMs": [
+ 1,
+ 1,
+ 1
+ ],
+ "rowCount": 6,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "lubm",
+ "queryId": "query_3",
+ "status": "PASS",
+ "medianMs": 7,
+ "repetitionsMs": [
+ 8,
+ 7,
+ 7
+ ],
+ "medianTtfrMs": 1,
+ "repetitionsTtfrMs": [
+ 1,
+ 1,
+ 1
+ ],
+ "rowCount": 6,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "lubm",
+ "queryId": "query_3",
+ "status": "PASS",
+ "medianMs": 9,
+ "repetitionsMs": [
+ 10,
+ 9,
+ 9
+ ],
+ "medianTtfrMs": 1,
+ "repetitionsTtfrMs": [
+ 1,
+ 1,
+ 1
+ ],
+ "rowCount": 6,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "lubm",
+ "queryId": "query_4",
+ "status": "PASS",
+ "medianMs": 18,
+ "repetitionsMs": [
+ 19,
+ 18,
+ 17
+ ],
+ "medianTtfrMs": 2,
+ "repetitionsTtfrMs": [
+ 2,
+ 2,
+ 2
+ ],
+ "rowCount": 34,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "lubm",
+ "queryId": "query_4",
+ "status": "PASS",
+ "medianMs": 28,
+ "repetitionsMs": [
+ 30,
+ 28,
+ 27
+ ],
+ "medianTtfrMs": 3,
+ "repetitionsTtfrMs": [
+ 3,
+ 3,
+ 3
+ ],
+ "rowCount": 34,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "lubm",
+ "queryId": "query_4",
+ "status": "PASS",
+ "medianMs": 15,
+ "repetitionsMs": [
+ 16,
+ 15,
+ 15
+ ],
+ "medianTtfrMs": 2,
+ "repetitionsTtfrMs": [
+ 2,
+ 2,
+ 2
+ ],
+ "rowCount": 34,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "lubm",
+ "queryId": "query_4",
+ "status": "PASS",
+ "medianMs": 22,
+ "repetitionsMs": [
+ 24,
+ 22,
+ 21
+ ],
+ "medianTtfrMs": 3,
+ "repetitionsTtfrMs": [
+ 3,
+ 3,
+ 3
+ ],
+ "rowCount": 34,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "lubm",
+ "queryId": "query_5",
+ "status": "PASS",
+ "medianMs": 95,
+ "repetitionsMs": [
+ 103,
+ 95,
+ 92
+ ],
+ "medianTtfrMs": 11,
+ "repetitionsTtfrMs": [
+ 12,
+ 11,
+ 10
+ ],
+ "rowCount": 719,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "lubm",
+ "queryId": "query_5",
+ "status": "PASS",
+ "medianMs": 145,
+ "repetitionsMs": [
+ 157,
+ 145,
+ 141
+ ],
+ "medianTtfrMs": 17,
+ "repetitionsTtfrMs": [
+ 19,
+ 17,
+ 16
+ ],
+ "rowCount": 719,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "lubm",
+ "queryId": "query_5",
+ "status": "PASS",
+ "medianMs": 85,
+ "repetitionsMs": [
+ 92,
+ 85,
+ 82
+ ],
+ "medianTtfrMs": 10,
+ "repetitionsTtfrMs": [
+ 11,
+ 10,
+ 10
+ ],
+ "rowCount": 719,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "lubm",
+ "queryId": "query_5",
+ "status": "PASS",
+ "medianMs": 110,
+ "repetitionsMs": [
+ 119,
+ 110,
+ 107
+ ],
+ "medianTtfrMs": 13,
+ "repetitionsTtfrMs": [
+ 14,
+ 13,
+ 12
+ ],
+ "rowCount": 719,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "lubm",
+ "queryId": "query_6",
+ "status": "TIMEOUT",
+ "medianMs": 60000,
+ "repetitionsMs": [
+ 64800,
+ 60000,
+ 58200
+ ],
+ "medianTtfrMs": -1,
+ "repetitionsTtfrMs": [
+ -1,
+ -1,
+ -1
+ ],
+ "rowCount": 0,
+ "hash": "",
+ "errorMessage": "Query execution exceeded timeout of 60000 ms"
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "lubm",
+ "queryId": "query_6",
+ "status": "TIMEOUT",
+ "medianMs": 60000,
+ "repetitionsMs": [
+ 64800,
+ 60000,
+ 58200
+ ],
+ "medianTtfrMs": -1,
+ "repetitionsTtfrMs": [
+ -1,
+ -1,
+ -1
+ ],
+ "rowCount": 0,
+ "hash": "",
+ "errorMessage": "Query execution exceeded timeout of 60000 ms"
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "lubm",
+ "queryId": "query_6",
+ "status": "TIMEOUT",
+ "medianMs": 60000,
+ "repetitionsMs": [
+ 64800,
+ 60000,
+ 58200
+ ],
+ "medianTtfrMs": -1,
+ "repetitionsTtfrMs": [
+ -1,
+ -1,
+ -1
+ ],
+ "rowCount": 0,
+ "hash": "",
+ "errorMessage": "Query execution exceeded timeout of 60000 ms"
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "lubm",
+ "queryId": "query_6",
+ "status": "TIMEOUT",
+ "medianMs": 60000,
+ "repetitionsMs": [
+ 64800,
+ 60000,
+ 58200
+ ],
+ "medianTtfrMs": -1,
+ "repetitionsTtfrMs": [
+ -1,
+ -1,
+ -1
+ ],
+ "rowCount": 0,
+ "hash": "",
+ "errorMessage": "Query execution exceeded timeout of 60000 ms"
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "lubm",
+ "queryId": "query_7",
+ "status": "PASS",
+ "medianMs": 280,
+ "repetitionsMs": [
+ 302,
+ 280,
+ 272
+ ],
+ "medianTtfrMs": 34,
+ "repetitionsTtfrMs": [
+ 37,
+ 34,
+ 32
+ ],
+ "rowCount": 67,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "lubm",
+ "queryId": "query_7",
+ "status": "PASS",
+ "medianMs": 430,
+ "repetitionsMs": [
+ 464,
+ 430,
+ 417
+ ],
+ "medianTtfrMs": 52,
+ "repetitionsTtfrMs": [
+ 57,
+ 52,
+ 49
+ ],
+ "rowCount": 67,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "lubm",
+ "queryId": "query_7",
+ "status": "PASS",
+ "medianMs": 250,
+ "repetitionsMs": [
+ 270,
+ 250,
+ 243
+ ],
+ "medianTtfrMs": 30,
+ "repetitionsTtfrMs": [
+ 33,
+ 30,
+ 29
+ ],
+ "rowCount": 67,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "lubm",
+ "queryId": "query_7",
+ "status": "PASS",
+ "medianMs": 330,
+ "repetitionsMs": [
+ 356,
+ 330,
+ 320
+ ],
+ "medianTtfrMs": 40,
+ "repetitionsTtfrMs": [
+ 44,
+ 40,
+ 38
+ ],
+ "rowCount": 67,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "lubm",
+ "queryId": "query_8",
+ "status": "TIMEOUT",
+ "medianMs": 60000,
+ "repetitionsMs": [
+ 64800,
+ 60000,
+ 58200
+ ],
+ "medianTtfrMs": -1,
+ "repetitionsTtfrMs": [
+ -1,
+ -1,
+ -1
+ ],
+ "rowCount": 0,
+ "hash": "",
+ "errorMessage": "Query execution exceeded timeout of 60000 ms"
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "lubm",
+ "queryId": "query_8",
+ "status": "TIMEOUT",
+ "medianMs": 60000,
+ "repetitionsMs": [
+ 64800,
+ 60000,
+ 58200
+ ],
+ "medianTtfrMs": -1,
+ "repetitionsTtfrMs": [
+ -1,
+ -1,
+ -1
+ ],
+ "rowCount": 0,
+ "hash": "",
+ "errorMessage": "Query execution exceeded timeout of 60000 ms"
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "lubm",
+ "queryId": "query_8",
+ "status": "TIMEOUT",
+ "medianMs": 60000,
+ "repetitionsMs": [
+ 64800,
+ 60000,
+ 58200
+ ],
+ "medianTtfrMs": -1,
+ "repetitionsTtfrMs": [
+ -1,
+ -1,
+ -1
+ ],
+ "rowCount": 0,
+ "hash": "",
+ "errorMessage": "Query execution exceeded timeout of 60000 ms"
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "lubm",
+ "queryId": "query_8",
+ "status": "TIMEOUT",
+ "medianMs": 60000,
+ "repetitionsMs": [
+ 64800,
+ 60000,
+ 58200
+ ],
+ "medianTtfrMs": -1,
+ "repetitionsTtfrMs": [
+ -1,
+ -1,
+ -1
+ ],
+ "rowCount": 0,
+ "hash": "",
+ "errorMessage": "Query execution exceeded timeout of 60000 ms"
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "lubm",
+ "queryId": "query_9",
+ "status": "PASS",
+ "medianMs": 520,
+ "repetitionsMs": [
+ 562,
+ 520,
+ 504
+ ],
+ "medianTtfrMs": 62,
+ "repetitionsTtfrMs": [
+ 68,
+ 62,
+ 59
+ ],
+ "rowCount": 208,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "lubm",
+ "queryId": "query_9",
+ "status": "TIMEOUT",
+ "medianMs": 60000,
+ "repetitionsMs": [
+ 64800,
+ 60000,
+ 58200
+ ],
+ "medianTtfrMs": -1,
+ "repetitionsTtfrMs": [
+ -1,
+ -1,
+ -1
+ ],
+ "rowCount": 0,
+ "hash": "",
+ "errorMessage": "Query execution exceeded timeout of 60000 ms"
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "lubm",
+ "queryId": "query_9",
+ "status": "PASS",
+ "medianMs": 460,
+ "repetitionsMs": [
+ 497,
+ 460,
+ 446
+ ],
+ "medianTtfrMs": 55,
+ "repetitionsTtfrMs": [
+ 61,
+ 55,
+ 52
+ ],
+ "rowCount": 208,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "lubm",
+ "queryId": "query_9",
+ "status": "TIMEOUT",
+ "medianMs": 60000,
+ "repetitionsMs": [
+ 64800,
+ 60000,
+ 58200
+ ],
+ "medianTtfrMs": -1,
+ "repetitionsTtfrMs": [
+ -1,
+ -1,
+ -1
+ ],
+ "rowCount": 0,
+ "hash": "",
+ "errorMessage": "Query execution exceeded timeout of 60000 ms"
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "lubm",
+ "queryId": "query_10",
+ "status": "PASS",
+ "medianMs": 15,
+ "repetitionsMs": [
+ 16,
+ 15,
+ 15
+ ],
+ "medianTtfrMs": 2,
+ "repetitionsTtfrMs": [
+ 2,
+ 2,
+ 2
+ ],
+ "rowCount": 4,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "lubm",
+ "queryId": "query_10",
+ "status": "PASS",
+ "medianMs": 22,
+ "repetitionsMs": [
+ 24,
+ 22,
+ 21
+ ],
+ "medianTtfrMs": 3,
+ "repetitionsTtfrMs": [
+ 3,
+ 3,
+ 3
+ ],
+ "rowCount": 4,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "lubm",
+ "queryId": "query_10",
+ "status": "PASS",
+ "medianMs": 13,
+ "repetitionsMs": [
+ 14,
+ 13,
+ 13
+ ],
+ "medianTtfrMs": 2,
+ "repetitionsTtfrMs": [
+ 2,
+ 2,
+ 2
+ ],
+ "rowCount": 4,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "lubm",
+ "queryId": "query_10",
+ "status": "PASS",
+ "medianMs": 18,
+ "repetitionsMs": [
+ 19,
+ 18,
+ 17
+ ],
+ "medianTtfrMs": 2,
+ "repetitionsTtfrMs": [
+ 2,
+ 2,
+ 2
+ ],
+ "rowCount": 4,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "lubm",
+ "queryId": "query_11",
+ "status": "PASS",
+ "medianMs": 42,
+ "repetitionsMs": [
+ 45,
+ 42,
+ 41
+ ],
+ "medianTtfrMs": 5,
+ "repetitionsTtfrMs": [
+ 6,
+ 5,
+ 5
+ ],
+ "rowCount": 224,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "lubm",
+ "queryId": "query_11",
+ "status": "PASS",
+ "medianMs": 65,
+ "repetitionsMs": [
+ 70,
+ 65,
+ 63
+ ],
+ "medianTtfrMs": 8,
+ "repetitionsTtfrMs": [
+ 9,
+ 8,
+ 8
+ ],
+ "rowCount": 224,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "lubm",
+ "queryId": "query_11",
+ "status": "PASS",
+ "medianMs": 38,
+ "repetitionsMs": [
+ 41,
+ 38,
+ 37
+ ],
+ "medianTtfrMs": 5,
+ "repetitionsTtfrMs": [
+ 6,
+ 5,
+ 5
+ ],
+ "rowCount": 224,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "lubm",
+ "queryId": "query_11",
+ "status": "PASS",
+ "medianMs": 50,
+ "repetitionsMs": [
+ 54,
+ 50,
+ 49
+ ],
+ "medianTtfrMs": 6,
+ "repetitionsTtfrMs": [
+ 7,
+ 6,
+ 6
+ ],
+ "rowCount": 224,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "lubm",
+ "queryId": "query_12",
+ "status": "PASS",
+ "medianMs": 28,
+ "repetitionsMs": [
+ 30,
+ 28,
+ 27
+ ],
+ "medianTtfrMs": 3,
+ "repetitionsTtfrMs": [
+ 3,
+ 3,
+ 3
+ ],
+ "rowCount": 15,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "lubm",
+ "queryId": "query_12",
+ "status": "PASS",
+ "medianMs": 42,
+ "repetitionsMs": [
+ 45,
+ 42,
+ 41
+ ],
+ "medianTtfrMs": 5,
+ "repetitionsTtfrMs": [
+ 6,
+ 5,
+ 5
+ ],
+ "rowCount": 15,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "lubm",
+ "queryId": "query_12",
+ "status": "PASS",
+ "medianMs": 25,
+ "repetitionsMs": [
+ 27,
+ 25,
+ 24
+ ],
+ "medianTtfrMs": 3,
+ "repetitionsTtfrMs": [
+ 3,
+ 3,
+ 3
+ ],
+ "rowCount": 15,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "lubm",
+ "queryId": "query_12",
+ "status": "PASS",
+ "medianMs": 34,
+ "repetitionsMs": [
+ 37,
+ 34,
+ 33
+ ],
+ "medianTtfrMs": 4,
+ "repetitionsTtfrMs": [
+ 4,
+ 4,
+ 4
+ ],
+ "rowCount": 15,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "lubm",
+ "queryId": "query_13",
+ "status": "TIMEOUT",
+ "medianMs": 60000,
+ "repetitionsMs": [
+ 64800,
+ 60000,
+ 58200
+ ],
+ "medianTtfrMs": -1,
+ "repetitionsTtfrMs": [
+ -1,
+ -1,
+ -1
+ ],
+ "rowCount": 0,
+ "hash": "",
+ "errorMessage": "Query execution exceeded timeout of 60000 ms"
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "lubm",
+ "queryId": "query_13",
+ "status": "TIMEOUT",
+ "medianMs": 60000,
+ "repetitionsMs": [
+ 64800,
+ 60000,
+ 58200
+ ],
+ "medianTtfrMs": -1,
+ "repetitionsTtfrMs": [
+ -1,
+ -1,
+ -1
+ ],
+ "rowCount": 0,
+ "hash": "",
+ "errorMessage": "Query execution exceeded timeout of 60000 ms"
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "lubm",
+ "queryId": "query_13",
+ "status": "PASS",
+ "medianMs": 220,
+ "repetitionsMs": [
+ 238,
+ 220,
+ 213
+ ],
+ "medianTtfrMs": 26,
+ "repetitionsTtfrMs": [
+ 29,
+ 26,
+ 25
+ ],
+ "rowCount": 1,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "lubm",
+ "queryId": "query_13",
+ "status": "TIMEOUT",
+ "medianMs": 60000,
+ "repetitionsMs": [
+ 64800,
+ 60000,
+ 58200
+ ],
+ "medianTtfrMs": -1,
+ "repetitionsTtfrMs": [
+ -1,
+ -1,
+ -1
+ ],
+ "rowCount": 0,
+ "hash": "",
+ "errorMessage": "Query execution exceeded timeout of 60000 ms"
+ },
+ {
+ "engine": "corese.next",
+ "dataset": "lubm",
+ "queryId": "query_14",
+ "status": "PASS",
+ "medianMs": 380,
+ "repetitionsMs": [
+ 410,
+ 380,
+ 369
+ ],
+ "medianTtfrMs": 46,
+ "repetitionsTtfrMs": [
+ 51,
+ 46,
+ 44
+ ],
+ "rowCount": 5916,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "corese.4.6.5",
+ "dataset": "lubm",
+ "queryId": "query_14",
+ "status": "TIMEOUT",
+ "medianMs": 60000,
+ "repetitionsMs": [
+ 64800,
+ 60000,
+ 58200
+ ],
+ "medianTtfrMs": -1,
+ "repetitionsTtfrMs": [
+ -1,
+ -1,
+ -1
+ ],
+ "rowCount": 0,
+ "hash": "",
+ "errorMessage": "Query execution exceeded timeout of 60000 ms"
+ },
+ {
+ "engine": "jena.6.2.0",
+ "dataset": "lubm",
+ "queryId": "query_14",
+ "status": "PASS",
+ "medianMs": 350,
+ "repetitionsMs": [
+ 378,
+ 350,
+ 340
+ ],
+ "medianTtfrMs": 42,
+ "repetitionsTtfrMs": [
+ 46,
+ 42,
+ 40
+ ],
+ "rowCount": 5916,
+ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "errorMessage": null
+ },
+ {
+ "engine": "rdf4j.5.3.2",
+ "dataset": "lubm",
+ "queryId": "query_14",
"status": "TIMEOUT",
"medianMs": 60000,
- "repetitionsMs": [60000, 60000, 60000],
+ "repetitionsMs": [
+ 64800,
+ 60000,
+ 58200
+ ],
"medianTtfrMs": -1,
- "repetitionsTtfrMs": [-1, -1, -1],
+ "repetitionsTtfrMs": [
+ -1,
+ -1,
+ -1
+ ],
"rowCount": 0,
"hash": "",
"errorMessage": "Query execution exceeded timeout of 60000 ms"
}
]
-}
+}
\ No newline at end of file
diff --git a/site/gen-mock.js b/site/gen-mock.js
new file mode 100644
index 0000000..eb117f9
--- /dev/null
+++ b/site/gen-mock.js
@@ -0,0 +1,238 @@
+// gen-mock.js — Generate complete mock-report-v2.json with all datasets
+'use strict';
+const fs = require('fs');
+
+const ENGINES = ['corese.next', 'corese.4.6.5', 'jena.6.2.0', 'rdf4j.5.3.2'];
+const HASH_OK = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855';
+
+function qrun(engine, dataset, queryId, status, medianMs, ttfrMs, rowCount, hash, err) {
+ return {
+ engine, dataset, queryId, status, medianMs,
+ repetitionsMs: [Math.round(medianMs * 1.08), medianMs, Math.round(medianMs * 0.97)],
+ medianTtfrMs: ttfrMs,
+ repetitionsTtfrMs: ttfrMs === -1 ? [-1, -1, -1] : [Math.round(ttfrMs * 1.1), ttfrMs, Math.round(ttfrMs * 0.95)],
+ rowCount: rowCount != null ? rowCount : null,
+ hash: hash || '',
+ errorMessage: err || null,
+ };
+}
+
+function lrun(engine, dataset, file, triples, ms, tpSec, memBefore, memAfter, tsPoints) {
+ return {
+ engine, dataset, file, triples,
+ loadingTimeMs: ms,
+ repetitionsMs: [Math.round(ms * 1.06), ms, Math.round(ms * 0.97)],
+ throughputTriplesPerSec: tpSec,
+ memoryBeforeMb: memBefore,
+ memoryAfterMb: memAfter,
+ memoryDeltaMb: memAfter - memBefore,
+ cpuPercent: Math.round(78 + Math.random() * 15),
+ timeSeries: tsPoints || [],
+ };
+}
+
+function ts(ms, triples, heap) { return { elapsedMs: ms, triplesLoaded: triples, heapUsedMb: heap }; }
+
+// ── Bowlogna ──────────────────────────────────────────────────────────────────
+const BOWLOGNA_QUERIES = {
+ query_1: { cat: 'GRAPH_PATTERN', rows: 1, sparql: 'SELECT (COUNT(?X) as ?n) WHERE { ?X a bb:Master_Thesis }' },
+ query_2: { cat: 'GRAPH_PATTERN', rows: 312, sparql: 'SELECT ?X WHERE { ?X a bb:Master_Thesis ; bb:hasMention ?m }' },
+ query_3: { cat: 'REGEX_TEMPORAL', rows: 980, sparql: 'SELECT ?X WHERE { ?X a bb:Student ; bb:graduatedAt ?d . FILTER(xsd:dateTime(?d) < NOW()) }' },
+ query_4: { cat: 'REGEX_TEMPORAL', rows: 452, sparql: 'SELECT ?X WHERE { ?X a bb:Student ; bb:enrolledIn ?m . FILTER(xsd:dateTime(?m) < NOW()) }' },
+ query_5: { cat: 'COMPLEX_JOIN', rows: 62, sparql: 'SELECT ?X (SUM(?c) as ?ects) WHERE { ?X bb:took ?u . ?u bb:hasCredits ?c } GROUP BY ?X' },
+ query_6: { cat: 'REGEX_TEMPORAL', rows: 145, sparql: 'SELECT ?X WHERE { ?X a bb:Student ; bb:lastName ?ln . FILTER(regex(?ln,"^D")) }' },
+ query_7: { cat: 'COMPLEX_JOIN', rows: 88, sparql: 'SELECT ?X ?Y WHERE { ?X bb:attr1 ?A . ?A bb:attr2 ?Y }' },
+ query_8: { cat: 'AGGREGATION', rows: 42, sparql: 'SELECT ?X (COUNT(?E) as ?Failures) WHERE { ?X a bb:Teaching_Unit . ?E bb:hasMark ?Y . FILTER(?Y < 3) } GROUP BY ?X' },
+ query_9: { cat: 'AGGREGATION', rows: 42, sparql: 'SELECT ?X (COUNT(?E) as ?Evals) WHERE { ?X a bb:Teaching_Unit . ?E bb:evaluatesTeachingUnit ?X } GROUP BY ?X' },
+ query_10: { cat: 'REGEX_TEMPORAL', rows: 1, sparql: 'SELECT ?X (COUNT(?Y) as ?n) WHERE { ?X a bb:Professor . ?Y bb:supervisedBy ?X . FILTER REGEX(?t,"Thesis","i") } GROUP BY ?X ORDER BY DESC(?n) LIMIT 1' },
+ query_11: { cat: 'AGGREGATION', rows: 5, sparql: 'SELECT ?X (AVG(?m) as ?avg) WHERE { ?X a bb:Student ; bb:hasMark ?m } GROUP BY ?X ORDER BY DESC(?avg) LIMIT 5' },
+ query_12: { cat: 'AGGREGATION', rows: 18, sparql: 'SELECT ?T (AVG(?d) as ?dur) WHERE { ?T a bb:Track ; bb:duration ?d } GROUP BY ?T' },
+ query_13: { cat: 'AGGREGATION', rows: 1, sparql: 'SELECT (AVG(?m) as ?avg) WHERE { ?X bb:hasMark ?m ; bb:atSemester 1 }' },
+ query_14: { cat: 'COMPLEX_JOIN', rows: 28, sparql: 'SELECT ?D ?P WHERE { ?X a bb:Student ; bb:inDept ?D . ?P a bb:Professor ; bb:inDept ?D }' },
+ query_15: { cat: 'GRAPH_PATTERN', rows: 7, sparql: 'SELECT ?U WHERE { ?U a bb:Teaching_Unit ; bb:language "en" }' },
+ query_16: { cat: 'REGEX_TEMPORAL', rows: 220, sparql: 'SELECT ?X WHERE { ?X a bb:Student ; bb:enrolledFrom ?s . FILTER(?s >= "2020-01-01"^^xsd:date) }' },
+ query_17: { cat: 'REGEX_TEMPORAL', rows: 195, sparql: 'SELECT ?X WHERE { ?X a bb:Student ; bb:enrolledTo ?e . FILTER(?e <= "2025-12-31"^^xsd:date) }' },
+};
+
+// [corese.next_ms, corese.4.6.5_ms, jena.6.2.0_ms, rdf4j.5.3.2_ms] — null = TIMEOUT
+const BOWLOGNA_PERF = {
+ query_1: [8, 12, 9, 11 ], query_2: [35, 55, 30, 45 ],
+ query_3: [280, 420, 250, 320 ], query_4: [190, 290, 170, 210 ],
+ query_5: [1200, 1850, 900, 1500 ], query_6: [95, 140, 80, 110 ],
+ query_7: [420, 650, 350, 480 ], query_8: [280, null, 320, 410 ],
+ query_9: [265, null, 305, 390 ], query_10: [45, 72, 48, null ],
+ query_11: [310, null, 290, null ], query_12: [185, 280, 170, 220 ],
+ query_13: [22, 35, 19, 28 ], query_14: [650, 980, 520, 780 ],
+ query_15: [12, 18, 11, 15 ], query_16: [350, null, 320, null ],
+ query_17: [340, null, 310, null ],
+};
+
+// ── BSBM ──────────────────────────────────────────────────────────────────────
+const BSBM_QUERIES = {
+ query_1: { cat: 'SEARCH', rows: 10, sparql: 'SELECT DISTINCT ?product WHERE { ?product a bsbm:Product ; bsbm:productFeature ?f1 ; bsbm:productPropertyNumeric1 ?v1 . FILTER(?v1 > 450) } ORDER BY ?product LIMIT 10' },
+ query_2: { cat: 'SEARCH', rows: 1, sparql: 'SELECT ?label ?comment ?producer WHERE { ?p rdfs:label ?label ; rdfs:comment ?comment ; bsbm:producer ?producer }' },
+ query_3: { cat: 'SEARCH', rows: 10, sparql: 'SELECT ?product WHERE { ?product a bsbm:Product ; bsbm:productFeature ?f ; bsbm:productPropertyNumeric1 ?v1 ; bsbm:productPropertyNumeric3 ?v3 . FILTER(?v1 > 350 && ?v3 < 950) } LIMIT 10' },
+ query_4: { cat: 'SEARCH', rows: 10, sparql: 'SELECT ?product ?label WHERE { { ?product bsbm:productFeature ?f } UNION { ?product rdfs:label ?label . FILTER regex(?label,"en") } } ORDER BY ?label LIMIT 10' },
+ query_5: { cat: 'JOIN', rows: 5, sparql: 'SELECT DISTINCT ?product WHERE { ?product bsbm:productFeature ?f . ?p2 bsbm:productFeature ?f . FILTER(?product != ?p2) } LIMIT 5' },
+ query_6: { cat: 'REVIEW', rows: 10, sparql: 'SELECT ?review ?title WHERE { ?review a bsbm:Review ; dc:title ?title ; bsbm:reviewFor ?product } LIMIT 10' },
+ query_7: { cat: 'OFFER', rows: 10, sparql: 'SELECT ?offer ?price WHERE { ?offer a bsbm:Offer ; bsbm:price ?price ; bsbm:product ?product } ORDER BY ?price LIMIT 10' },
+ query_8: { cat: 'OFFER', rows: 1, sparql: 'SELECT ?title ?text WHERE { ?review dc:title ?title ; rev:text ?text ; bsbm:reviewFor ?product }' },
+ query_9: { cat: 'REVIEW', rows: 10, sparql: 'SELECT DISTINCT ?reviewer WHERE { ?review bsbm:reviewFor ?product ; rev:reviewer ?reviewer } LIMIT 10' },
+ query_10: { cat: 'OFFER', rows: 10, sparql: 'SELECT DISTINCT ?offer ?vendor WHERE { ?offer bsbm:vendor ?vendor ; bsbm:product ?product } LIMIT 10' },
+ query_11: { cat: 'REVIEW', rows: 10, sparql: 'SELECT ?review ?rating WHERE { ?review bsbm:rating1 ?r1 ; bsbm:rating2 ?r2 . BIND((?r1+?r2)/2 AS ?rating) } LIMIT 10' },
+ query_12: { cat: 'REVIEW', rows: 5, sparql: 'SELECT ?review WHERE { ?review a bsbm:Review ; bsbm:reviewFor ?product . FILTER NOT EXISTS { ?other bsbm:reviewFor ?product . FILTER(?other != ?review) } } LIMIT 5' },
+};
+
+const BSBM_PERF = {
+ query_1: [42, 68, 38, 55 ], query_2: [8, 13, 7, 10 ],
+ query_3: [65, 98, 58, 80 ], query_4: [120, 185, 105, 145 ],
+ query_5: [380, 590, 310, 450 ], query_6: [28, 44, 25, 35 ],
+ query_7: [52, 80, 45, 65 ], query_8: [15, 23, 13, 18 ],
+ query_9: [95, 145, 85, 115 ], query_10: [45, 70, 40, 58 ],
+ query_11: [75, 115, 68, 92 ], query_12: [null, null, 280, null ],
+};
+
+// ── LUBM ──────────────────────────────────────────────────────────────────────
+const LUBM_QUERIES = {
+ query_1: { cat: 'SELECTIVE', rows: 4, sparql: 'SELECT ?X WHERE { ?X a ub:GraduateStudent ; ub:takesCourse ?C . ?C a ub:GraduateCourse ; ub:subOrganizationOf }' },
+ query_2: { cat: 'LARGE_RESULT', rows: 2348, sparql: 'SELECT ?X ?Y ?Z WHERE { ?X a ub:GraduateStudent ; ub:memberOf ?Y . ?Y a ub:Department ; ub:subOrganizationOf ?Z . ?Z a ub:University }' },
+ query_3: { cat: 'SELECTIVE', rows: 6, sparql: 'SELECT ?X WHERE { ?X a ub:Publication ; ub:publicationAuthor ?Y . ?Y ub:memberOf }' },
+ query_4: { cat: 'TRANSITIVE', rows: 34, sparql: 'SELECT ?X ?Y1 ?Y2 ?Y3 WHERE { ?X a ub:Professor ; ub:worksFor ; ub:name ?Y1 ; ub:emailAddress ?Y2 ; ub:telephone ?Y3 }' },
+ query_5: { cat: 'SELECTIVE', rows: 719, sparql: 'SELECT ?X WHERE { ?X a ub:Person ; ub:memberOf }' },
+ query_6: { cat: 'LARGE_RESULT', rows: 7790, sparql: 'SELECT ?X WHERE { ?X a ub:Student }' },
+ query_7: { cat: 'SELECTIVE', rows: 67, sparql: 'SELECT ?X ?Y WHERE { ?X a ub:Student ; ub:takesCourse ?Y . ?Y a ub:Course . ?Y ub:teachingAssistantOf ?X }' },
+ query_8: { cat: 'SELECTIVE', rows: 7790, sparql: 'SELECT ?X ?Y ?Z WHERE { ?X a ub:Student ; ub:emailAddress ?Y ; ub:memberOf ?Z . ?Z a ub:Department ; ub:subOrganizationOf }' },
+ query_9: { cat: 'LARGE_RESULT', rows: 208, sparql: 'SELECT ?X ?Y ?Z WHERE { ?X a ub:Student ; ub:advisor ?Y ; ub:takesCourse ?Z . ?Y ub:teacherOf ?Z }' },
+ query_10: { cat: 'SELECTIVE', rows: 4, sparql: 'SELECT ?X WHERE { ?X a ub:Student ; ub:takesCourse ?C . ?C a ub:GraduateCourse ; ub:subOrganizationOf }' },
+ query_11: { cat: 'TRANSITIVE', rows: 224, sparql: 'SELECT ?X WHERE { ?X a ub:ResearchGroup ; ub:subOrganizationOf }' },
+ query_12: { cat: 'TRANSITIVE', rows: 15, sparql: 'SELECT ?X ?Y WHERE { ?X a ub:Chair ; ub:worksFor ?Y . ?Y ub:subOrganizationOf }' },
+ query_13: { cat: 'TRANSITIVE', rows: 1, sparql: 'SELECT ?X WHERE { ?X a ub:Person ; ub:hasAlumnus }' },
+ query_14: { cat: 'SELECTIVE', rows: 5916, sparql: 'SELECT ?X WHERE { ?X a ub:UndergraduateStudent }' },
+};
+
+const LUBM_PERF = {
+ query_1: [12, 18, 10, 15 ], query_2: [450, 720, 380, null ],
+ query_3: [8, 12, 7, 9 ], query_4: [18, 28, 15, 22 ],
+ query_5: [95, 145, 85, 110 ], query_6: [null,null, null, null ],
+ query_7: [280, 430, 250, 330 ], query_8: [null,null, null, null ],
+ query_9: [520, null, 460, null ], query_10: [15, 22, 13, 18 ],
+ query_11: [42, 65, 38, 50 ], query_12: [28, 42, 25, 34 ],
+ query_13: [null,null, 220, null ], query_14: [380, null, 350, null ],
+};
+
+// ── DBpedia loading (5 files × 3 engines) ─────────────────────────────────────
+const DBPEDIA_FILES = [
+ { file: 'persondata_en.nt', triples: 356914 },
+ { file: 'homepages_en.nt', triples: 394897 },
+ { file: 'category_labels_en.nt', triples: 565108 },
+ { file: 'disambiguations_en.nt', triples: 768924 },
+ { file: 'specific_mappingbased_properties_en.nt', triples: 182530 },
+];
+
+// ── Build loadingRuns ─────────────────────────────────────────────────────────
+const loadingRuns = [];
+
+// Bowlogna
+const bowlognaTs = {
+ 'corese.next': [ts(0,0,42),ts(500,310000,115),ts(1000,650000,198),ts(1500,980000,280),ts(2000,1234567,387)],
+ 'corese.4.6.5': [ts(0,0,44),ts(500,260000,125),ts(1000,560000,215),ts(1500,880000,310),ts(2000,1150000,405),ts(2500,1234567,430)],
+ 'jena.6.2.0': [ts(0,0,45),ts(500,350000,130),ts(1000,720000,220),ts(1500,1050000,315),ts(2000,1234567,412)],
+ 'rdf4j.5.3.2': [ts(0,0,40),ts(500,220000,110),ts(1000,480000,210),ts(1500,750000,320),ts(2000,1020000,430),ts(2500,1234567,510)],
+};
+const bowlognaTimes = { 'corese.next': 2450, 'corese.4.6.5': 3850, 'jena.6.2.0': 2180, 'rdf4j.5.3.2': 3150 };
+ENGINES.forEach(eng => {
+ const ms = bowlognaTimes[eng];
+ loadingRuns.push(lrun(eng,'bowlogna','bowlogna.ttl',1234567,ms,Math.round(1234567/(ms/1000)),40,380+Math.random()*130,bowlognaTs[eng]));
+});
+
+// BSBM
+const bsbmTimes = { 'corese.next': 3800, 'corese.4.6.5': 5900, 'jena.6.2.0': 3200, 'rdf4j.5.3.2': 5100 };
+ENGINES.forEach(eng => {
+ const ms = bsbmTimes[eng];
+ loadingRuns.push(lrun(eng,'bsbm','bsbm_1m.nt',1800000,ms,Math.round(1800000/(ms/1000)),45,500+Math.random()*100,[]));
+});
+
+// LUBM
+const lubmTimes = { 'corese.next': 7200, 'corese.4.6.5': 11400, 'jena.6.2.0': 5800, 'rdf4j.5.3.2': 9400 };
+ENGINES.forEach(eng => {
+ const ms = lubmTimes[eng];
+ loadingRuns.push(lrun(eng,'lubm','lubm_univ10.nt',3200000,ms,Math.round(3200000/(ms/1000)),50,850+Math.random()*180,[]));
+});
+
+// DBpedia
+DBPEDIA_FILES.forEach(({ file, triples }) => {
+ ENGINES.forEach(eng => {
+ const factor = eng === 'corese.next' ? 1.0 : eng === 'corese.4.6.5' ? 1.60 : eng === 'jena.6.2.0' ? 0.85 : 1.35;
+ const ms = Math.round((triples / 480000) * 1000 * factor);
+ const mem = 80 + triples / 3500;
+ loadingRuns.push(lrun(eng,'dbpedia',file,triples,ms,Math.round(triples/(ms/1000)),45,mem,[]));
+ });
+});
+
+// ── Build queryRuns ───────────────────────────────────────────────────────────
+const queryRuns = [];
+
+function addQueryRuns(dataset, queries, perf) {
+ Object.entries(queries).forEach(([qid, meta]) => {
+ const times = perf[qid] || [50, 45, 60];
+ ENGINES.forEach((eng, i) => {
+ const ms = times[i];
+ if (ms === null) {
+ queryRuns.push(qrun(eng, dataset, qid, 'TIMEOUT', 60000, -1, 0, '', 'Query execution exceeded timeout of 60000 ms'));
+ } else {
+ queryRuns.push(qrun(eng, dataset, qid, 'PASS', ms, Math.round(ms * 0.12), meta.rows, HASH_OK, null));
+ }
+ });
+ });
+}
+
+addQueryRuns('bowlogna', BOWLOGNA_QUERIES, BOWLOGNA_PERF);
+addQueryRuns('bsbm', BSBM_QUERIES, BSBM_PERF);
+addQueryRuns('lubm', LUBM_QUERIES, LUBM_PERF);
+
+// ── datasetQueries metadata ────────────────────────────────────────────────────
+function buildDsMeta(queries) {
+ return Object.entries(queries).map(([id, m]) => ({
+ id, category: m.cat, label: id.replace('query_','Q'), sparql: m.sparql,
+ expectedRowCount: m.rows, expectedHash: HASH_OK,
+ }));
+}
+
+// ── Assemble & write ──────────────────────────────────────────────────────────
+const mock = {
+ metadata: {
+ version: '2.0',
+ generatedAt: '2026-10-29T16:00:00Z',
+ git: { benchmarkCommit: '360e097', coreseCommit: '3a7b8e1', branch: 'main' },
+ environment: {
+ cpuModel: 'AMD EPYC 7763 64-Core Processor', cpuArchitecture: 'x86_64',
+ cpuSockets: 1, cpuCores: 16, cpuThreads: 32, cpuFrequencyMhz: 2450.0,
+ cpuGovernor: 'performance', ramTotalGb: 64.0, swapTotalGb: 8.0, swappiness: 1,
+ osDistribution: 'Ubuntu 24.04.1 LTS', osKernel: '6.8.0-45-generic',
+ jvmVendor: 'Ubuntu', jvmVersion: '21.0.4+7-Ubuntu-1ubuntu224.04',
+ jvmFlags: ['-Xms4g', '-Xmx8g', '-XX:+UseG1GC'],
+ },
+ protocol: { warmup: 1, repetitions: 3, queryRepetitions: 3, queryTimeoutMs: 60000, loadTimeoutMs: 120000, metric: 'median' },
+ engines: [
+ { id: 'corese.next', family: 'corese', version: '5.0.0-SNAPSHOT', label: 'Corese v5 (Next)' },
+ { id: 'corese.4.6.5', family: 'corese', version: '4.6.5', label: 'Corese v4.6.5' },
+ { id: 'jena.6.2.0', family: 'jena', version: '6.2.0', label: 'Apache Jena 6.2.0' },
+ { id: 'rdf4j.5.3.2', family: 'rdf4j', version: '5.3.2', label: 'Eclipse RDF4J 5.3.2' },
+ ],
+ datasetQueries: {
+ bowlogna: buildDsMeta(BOWLOGNA_QUERIES),
+ bsbm: buildDsMeta(BSBM_QUERIES),
+ lubm: buildDsMeta(LUBM_QUERIES),
+ },
+ },
+ loadingRuns,
+ queryRuns,
+};
+
+fs.writeFileSync('C:/DEV/corese-benchmark/site/data/mock-report-v2.json', JSON.stringify(mock, null, 2), 'utf8');
+const js = 'window.__BENCHMARK_DATA__ = ' + JSON.stringify(mock) + ';\n';
+fs.writeFileSync('C:/DEV/corese-benchmark/site/data/report-data.js', js, 'utf8');
+
+console.log('loadingRuns:', mock.loadingRuns.length, '| datasets:', [...new Set(mock.loadingRuns.map(r=>r.dataset))].join(', '));
+console.log('queryRuns: ', mock.queryRuns.length, '| datasets:', [...new Set(mock.queryRuns.map(r=>r.dataset))].join(', '));
+console.log('report-data.js:', (js.length/1024).toFixed(1), 'KB');
diff --git a/site/index.html b/site/index.html
index 9b22827..e7dcf2a 100644
--- a/site/index.html
+++ b/site/index.html
@@ -3,354 +3,83 @@
- Corese · Benchmark Dashboard
+ Corese Benchmark Dashboard
-
-
-
-
+
+
-
+