Triple Stores
We tested the performance of two triple stores: Virtuoso and RDF-3X. We compare them to our own triple store on a couple of benchmarks.
Software Installation
Installation von Virtuoso Open-Source Edition:
- Anweisungen in der README-Datei folgen.
Installation von rdf3x:
- Kompilieren
Installation von SparqlEngineDraft:
Anweisungen befolgen.
Data Import
Um den Datensatz in die Triple-Stores laden zu können, muss dieser Satz in ein für die RDF-Speicherung gängiges Format umgewandelt werden. Ausgewählt wurde das NT-Format. Der ursprüngliche Datensatz enthält Values und Entities. Values waren schon nt-konform, die Entities mussten umgewandelt werden. Dafür wurden die Entities in eckige Klammern gesetzt und unzulässige Zeichen durch die entsprechenden Prozent-Kodierungen oder durch von uns definierte Ersatzzeichen ersetzt (siehe Ersetzungtabelle unten).
Ersetzungstabelle:
% |
< |
> |
\ |
^ |
` |
space |
||||||
%25 |
%3C |
%3E |
%5C |
%5E |
%60 |
_ |
Z.B.: Michael Jackson --> <Michael_Jackson>
Data Import Virtuoso:
Das Importieren der Daten in den Virtuoso Store wurde mit dem Bulk loading process durchgeführt. Bei diesem Prozess muss der Name des RDF-Graphen als graph_iri eingegeben werden. Unter diesem Namen ist der RDF-Satz bei Virtuoso erreichbar: Wenn man eine Sparql-Anfrage an den Store erstellt, muss man die graph_iri als prefix für jede Entity benutzen.
Z.B.: Michael Jackson --> '<http://foo/Michael_Jackson>'
* Für bessere Ladeperformance empfiehlt sich die Variablen NumberOfBuffers und MaxDirtyBuffers in der virtuoso.ini-Datei auf einen höheren Wert zu setzen (genaueres ist in virtuoso.ini beschrieben). Die Datei liegt unter <Installationsordner von virtuoso>/var/lib/virtuoso/db/virtuoso.ini
Data Import Rdf3x:
Das Importieren der Daten in den Rdf3x-Store erfolgt durch ein Skript in <Installationsordner von Rdf3x>/bin/rdf3xload <DB-Name> <RDF-Satz-Pfad>. Bei der Anfragegenerierung ist kein zusätzlicher Präfix erforderlich.
Z.B.: Michael Jackson --> '<Michael_Jackson>'
Data Import SparqlEngineDraft:
Anweisungen befolgen. Bei der Anfragegenerierung ist kein zusätzlicher Präfix erforderlich.
Z.B.: Michael Jackson --> '<Michael_Jackson>'
Indexerstellung:
Die Größe des Input-RDF-Sets im NT-Format beträgt 17 GB.
RDF-Store |
Ladezeit |
Indexgröße auf der Festplatte |
Indexgröße im Arbeitspeicher (unmittelbar nach dem Serverstart) |
|||
Virtuoso |
23 min |
7.9 GB |
5.8 GB |
|||
Rdf3x |
76 min |
12 GB |
? |
|||
SparqlEngineDraft |
26 min |
14.2 GB |
3.5 GB |
Tests
Zeilenformat: <time> (number of lines in result)
Query \ RDF Store |
rdf3x |
Virtuoso |
||||
Query 1 |
0.730ms(1) |
36.819ms(1) |
2433.000ms(1) |
|||
Query 2 |
16.472ms(5162) |
4.587ms(5162) |
121.000ms(5164) |
|||
Query 3 |
98.460ms(1579) |
57.766ms(1579) |
530.000ms(1579) |
|||
Query 4 |
24.536ms(9767) |
6.898ms(9767) |
38.000ms(9767) |
|||
Query 5 |
5.164ms(4) |
109.617ms(4) |
1229.000ms(4) |
|||
Query 6 |
75.784ms(0) |
41.713ms(0) |
138.000ms(0) |
|||
Query 7 |
31.728ms(3697) |
17.634ms(3697) |
101.000ms(3697) |
|||
Query 8 |
9.443ms(164) |
19.144ms(164) |
163.000ms(164) |
|||
Query 9 |
0.513ms(128) |
2.586ms(128) |
883.000ms(128) |
|||
Query 10 |
466.715ms(1528) |
208.694ms(1528) |
801.000ms(1528) |
Queries
Query 1
SELECT ?x WHERE { ?x <is-a> <Book> . ?x <Author> <Anthony_Newman_(Author)> }
Query 2
SELECT ?x WHERE { ?x <Genre> <Comedy> . ?x <is-a> <Award-Nominated_Work> . ?x <is-a> <Film> . }
Query 3
SELECT ?x WHERE { ?x <is-a> <Politician> . ?x <Film_performance> ?y . ?y <Genre> <Comedy> . }
Query 4
SELECT ?x WHERE { ?x <is-a> <Olympic_athlete> . ?x <is-a> <Deceased_Person> }
Query 5
SELECT ?x WHERE { ?x <Release> <Technodrome,_Volume_2_(Consumer_product)> . ?x <is-a> <Canonical_Version> . ?x <is-a> <Musical_Recording> . }
Query 6
SELECT ?x ?y WHERE { ?x <is-a> <Person> . ?x <Country_of_nationality> <Germany> . ?x <Author> ?y . ?y <is-a> <Award-Nominated_Work> }
Query 7
SELECT ?x WHERE { ?x <is-a> <Politician> . ?x <Parent> ?y . ?x <Parent> ?z . ?y <is-a> <Politician> . ?z <is-a> <Politician> }
Query 8
SELECT ?x ?y WHERE{ ?x <is-a> <Monarch> . ?x <is-a> <Deceased_Person> . ?x <Cause_of_death> <Assassination> . ?x <Place_of_birth> ?y }
Query 9
SELECT ?x WHERE{ ?x <is-a> <Lake> . ?x <Contained_by> <Russia> }
Query 10
SELECT ?x ?y ?z WHERE{ ?x <is-a> <Musical_Recording> . ?x <Recorded_by> ?y . ?y <Award_Won> <Bollywood_Movie_Humanitarian_Award> . ?y <Celebrity_friend> ?z . ?z <Profession> <Prophet> }