Size: 5616
Comment:
|
Size: 5621
Comment:
|
Deletions are marked like this. | Additions are marked like this. |
Line 16: | Line 16: |
=== Installation von SparqlEngineDraft: === 1. [[https://code.google.com/p/rdf3x/downloads/list|Klonen]] 2. [[https://github.com/Buchhold/SparqlEngineDraft#1-build|Anweisungen]] befolgen. |
|
Line 17: | Line 20: |
Um den Datensatz in die beide Stores laden zu können, musste dieser Satz in einen für RDF-Speicherung gängigen Format umgewandelt werden. Ausgewählt wurde "*.nt"-Format. Der ursprünglicher Satz enthielt Values und Enteties. Values waren schon nt-conform, die Enteties mussten umgewandelt werden. Dafür wurden die Enteties in die eckigen Klammer gesetzt und die unzulässige Zeichen durch die entsprechende Prozent-Kodierungen oder auch von uns defenierten Ersatzzeichen ersetzt. |
Um den Datensatz in die Triple-Stores laden zu können, musste dieser Satz in einen für RDF-Speicherung gängigen Format umgewandelt werden. Ausgewählt wurde "*.nt"-Format. Der ursprünglicher Satz enthielt Values und Enteties. Values waren schon nt-konform, die Enteties mussten umgewandelt werden. Dafür wurden die Enteties in die eckigen Klammer gesetzt und die unzulässige Zeichen durch die entsprechende Prozent-Kodierungen oder auch von uns definierten Ersatzzeichen ersetzt. |
Line 22: | Line 25: |
|| " |||| # |||| % |||| < |||| > |||| [ |||| \ |||| ] |||| ^ |||| { |||| | |||| } |||| ` |||| space || || %22 |||| %23 |||| %25 |||| %3C |||| %3E |||| %5B |||| %5C |||| %5D |||| %5E |||| %7B |||| %7C |||| %7D |||| %60 |||| _ || |
|| % |||| < |||| > |||| \ |||| ^ |||| ` |||| space || || %25 |||| %3C |||| %3E |||| %5C |||| %5E |||| %60 |||| _ || |
Line 28: | Line 31: |
Datenladen in den Virtuoso wurde mit [[http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/VirtBulkRDFLoader|Bulk loading process]] gemacht. Bei diesem Prozess muss der Name des RDF-Graphen als graph_iri eingegeben werden. Unter dieser Namen ist der RDF-Satz bei Virtuoso erreichbar und man benutzt graph_iri als prefix bei jeder Entety, wenn man eine Spqrql-Anfrage an den Store erstellt. | Datenladen in den Virtuoso wurde mit [[http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/VirtBulkRDFLoader|Bulk loading process]] durchgefuhrt. Bei diesem Prozess muss der Name des RDF-Graphen als graph_iri eingegeben werden. Unter dieser Namen ist der RDF-Satz bei Virtuoso erreichbar und man benutzt graph_iri als prefix bei jeder Entety, wenn man eine Spqrql-Anfrage an den Store erstellt. |
Line 32: | Line 35: |
''*'' Für die bessere Ladeperformance empfiehlt sich die Variablen ''NumberOfBuffers'' und ''MaxDirtyBuffers'' auf einen höheren Wert in der virtuoso.ini Datei zu setzten(Genauere ist in virtuoso.ini beschrieben). Die Datei liegt unter ''<Installationsordner von virtuoso>/var/lib/virtuoso/db/virtuoso.ini'' |
|
Line 33: | Line 38: |
Das Datenladen in den Rdf3x-Store erfolgt durch einen Skript ''<Installationsordner von Rdf3x>/bin/rdf3xload <DB-Name> <RDF-Satz-Pfad>''. Das wars! Bei der Nfragestellung muss man keinen zusätzlichen Prefix eingeben. | Das Datenladen in den Rdf3x-Store erfolgt durch einen Skript ''<Installationsordner von Rdf3x>/bin/rdf3xload <DB-Name> <RDF-Satz-Pfad>''. Kein zusätzlicher Präfix ist bei der Anfragegenerierung erforderlich. |
Line 37: | Line 42: |
=== Data Import SparqlEngineDraft: === [[https://github.com/Buchhold/SparqlEngineDraft#2-creating-an-index|Anweisungen]] befolgen. Kein zusätzlicher Präfix ist bei der Anfragegenerierung erforderlich. |
|
Line 38: | Line 45: |
=== Ladezeiten: === || '''RDF-Store'''|||| '''Ladezeit'''|| || Virtuoso |||| 1170 min|| || Rdf3x|||| noch nicht gemessen, aber deutlich weniger als bei Virtuoso|| |
Z.B.: '' Mikel Jackson --> '<Mikel_Jackson>' '' |
Line 43: | Line 47: |
== Queries == === Testvorgang === Als test-Framework wurde ein Python-Skript verwendet. Dabei wurde folgendes Abschnitt immer 3-Fach für jede Kombination Query<>RDF-Store ausgeführt. |
=== Indexerstellung: === |
Line 47: | Line 49: |
''start = int(round(time.time()*1000))'' | Die Größe des Input-RDF-Sets in der NT-Format beträgt 17 GB. |
Line 49: | Line 51: |
''process = subprocess.Popen('''command''', stdout=subprocess.PIPE, shell=True)'' ''out, err = process.communicate()'' ''end = int(round(time.time()*1000)) '' wo '' '''command''' = virtuosoISQL_path + "isql 127.0.0.1:1113 dba dba " + queryFile'' für Virtuoso '' '''command''' = rdf3x_path + "rdf3xquery" + dataBase + " " + queryFile'' für rdf3x === Anfragen === Für jede Anfrage wurden zwei Datein erstellt die diese Anfrage enthalten: Eine für rdf3x und eine für Virtuoso. '''Beispiel Anfrage für rdf3x:''' ''SELECT * WHERE {'' ''<The%20Format%20(Musical%20Recording)%20%231> ?b ?c'' ''}'' '''Beispiel Anfrage für Virtuoso:''' ''SPARQL SELECT * WHERE {'' ''<http://foo.org/The%20Format%20(Musical%20Recording)%20%231> ?b ?c'' ''};'' |
|| '''RDF-Store''' |||| '''Ladezeit''' |||| '''Indexgroße auf der Festplatte''' || '''Indexgroße in der Arbeitspeicher''' || || Virtuoso |||| 23 min |||| 7.9 GB |||| ? || || Rdf3x |||| 76 min |||| 12 GB |||| ? || || SparqlEngineDraft |||| 26 min |||| 14.2 GB |||| 3.5 GB || |
Line 82: | Line 57: |
'''Testbeschreibung:''' Alle Testfälle wurden mit dem gelöschten Cache durchgeführt. |
|
Line 86: | Line 63: |
|| '''Query 1''' |||| 0ms(1) |||| 11ms(1) || || '''Query 2''' |||| 16ms(5162) |||| 8ms(5162) || || '''Query 3''' |||| 114ms(1579) |||| 55ms(1579) || || '''Query 4''' |||| 23ms(9767) |||| 15ms(9767) || || '''Query 5''' |||| 5ms(4) |||| 247ms(4) || || '''Query 6''' |||| 63ms(0) |||| 67ms(0) || || '''Query 7''' |||| 27ms(3697) |||| 32ms(3550) || || '''Query 8''' |||| 9ms(164) |||| 46ms(164) || || '''Query 9''' |||| 0ms(128) |||| 1ms(128) || || '''Query 10''' |||| 461ms(1528) |||| 319ms(1528) || |
|| '''Query 1''' |||| 0.581ms(1) |||| 13.827ms(1) || || '''Query 2''' |||| 17.632ms(5162) |||| 10.568ms(5162) || || '''Query 3''' |||| 98.772ms(1579) |||| 57.344ms(1579) || || '''Query 4''' |||| 22.731ms(9767) |||| 16.673ms(9767) || || '''Query 5''' |||| 5.030ms(4) |||| 239.383ms(4) || || '''Query 6''' |||| 65.057ms(0) |||| 72.879ms(0) || || '''Query 7''' |||| 28.483ms(3697) |||| 30.418ms(3697) || || '''Query 8''' |||| 9.559ms(164) |||| 21.509ms(164) || || '''Query 9''' |||| 0.501ms(128) |||| 2.319ms(128) || || '''Query 10''' |||| 476.191ms(1528) |||| 314.789ms(1528) || |
Triple Stores
We tested the performance of two triple stores: Virtuoso and RDF-3X. We compare them to our own triple score on a couple of benchmarks.
Software Installation
Installation von Virtuoso Open-Source Edition:
- Anweisungen in 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, musste dieser Satz in einen für RDF-Speicherung gängigen Format umgewandelt werden. Ausgewählt wurde "*.nt"-Format. Der ursprünglicher Satz enthielt Values und Enteties. Values waren schon nt-konform, die Enteties mussten umgewandelt werden. Dafür wurden die Enteties in die eckigen Klammer gesetzt und die unzulässige Zeichen durch die entsprechende Prozent-Kodierungen oder auch von uns definierten Ersatzzeichen ersetzt.
Ersetzungstabelle:
% |
< |
> |
\ |
^ |
` |
space |
||||||
%25 |
%3C |
%3E |
%5C |
%5E |
%60 |
_ |
Z.B.: Mikel Jackson --> <Mikel_Jackson>
Data Import Virtuoso:
Datenladen in den Virtuoso wurde mit Bulk loading process durchgefuhrt. Bei diesem Prozess muss der Name des RDF-Graphen als graph_iri eingegeben werden. Unter dieser Namen ist der RDF-Satz bei Virtuoso erreichbar und man benutzt graph_iri als prefix bei jeder Entety, wenn man eine Spqrql-Anfrage an den Store erstellt.
Z.B.: Mikel Jackson --> '<http://foo/Mikel_Jackson>'
* Für die bessere Ladeperformance empfiehlt sich die Variablen NumberOfBuffers und MaxDirtyBuffers auf einen höheren Wert in der virtuoso.ini Datei zu setzten(Genauere ist in virtuoso.ini beschrieben). Die Datei liegt unter <Installationsordner von virtuoso>/var/lib/virtuoso/db/virtuoso.ini
Data Import Rdf3x:
Das Datenladen in den Rdf3x-Store erfolgt durch einen Skript <Installationsordner von Rdf3x>/bin/rdf3xload <DB-Name> <RDF-Satz-Pfad>. Kein zusätzlicher Präfix ist bei der Anfragegenerierung erforderlich.
Z.B.: Mikel Jackson --> '<Mikel_Jackson>'
Data Import SparqlEngineDraft:
Anweisungen befolgen. Kein zusätzlicher Präfix ist bei der Anfragegenerierung erforderlich.
Z.B.: Mikel Jackson --> '<Mikel_Jackson>'
Indexerstellung:
Die Größe des Input-RDF-Sets in der NT-Format beträgt 17 GB.
RDF-Store |
Ladezeit |
Indexgroße auf der Festplatte |
Indexgroße in der Arbeitspeicher |
|||
Virtuoso |
23 min |
7.9 GB |
? |
|||
Rdf3x |
76 min |
12 GB |
? |
|||
26 min |
14.2 GB |
3.5 GB |
Tests
Testbeschreibung: Alle Testfälle wurden mit dem gelöschten Cache durchgeführt.
Zeilenformat: <time> (number of lines in result)
Query \ RDF Store |
rdf3x |
|||
Query 1 |
0.581ms(1) |
13.827ms(1) |
||
Query 2 |
17.632ms(5162) |
10.568ms(5162) |
||
Query 3 |
98.772ms(1579) |
57.344ms(1579) |
||
Query 4 |
22.731ms(9767) |
16.673ms(9767) |
||
Query 5 |
5.030ms(4) |
239.383ms(4) |
||
Query 6 |
65.057ms(0) |
72.879ms(0) |
||
Query 7 |
28.483ms(3697) |
30.418ms(3697) |
||
Query 8 |
9.559ms(164) |
21.509ms(164) |
||
Query 9 |
0.501ms(128) |
2.319ms(128) |
||
Query 10 |
476.191ms(1528) |
314.789ms(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> }