SPARQL ✨
| Back to OverviewSkalierung
- Vertikale Skalierung bedeuted, dass jeder Knoten mehr Leistung hat (Mehr RAM, )
- Horizontale Skalierung bedeuted, dass mehr Knoten hinzugefügt werden
- Verteilte Tabellen auf mehreren Knoten
- Synchronisations und Konsistenzprobleme => Overhead
- Sharding: Daten werden auf mehrere Knoten verteilt und können so parallel abgefragt werden
- Replikation: Daten werden auf mehrere Knoten verteilt und können so parallel abgefragt werden
- 2PC: 2 Phase Commit => 1. Phase Prepare | 2. Phase Commit mit ACK's mal wieder :)
- CAP: Consistency | Availability | Partition Tolerance => Nur 2 von 3. gehen
- Daher BASE: Basically Available | Soft State (kann also temporär inkonsistent sein)| Eventual Consistency als ACID Ersatz
NoSQL
- Dokumentendatenbanken
- Key-Value Datenbanken
- Graphdatenbanken
- Spaltenorientierte Datenbanken
Dokumentendatenbanken
- Dokumente sind JSON / XML / PDF / ...
- Dokumente sind indexiert
- Bsp: MongoDB (Nutzt BSON: Binary Json)
Key-Value Datenbanken
- Key-Value Paare
- Bsp: Redis (Wird oft als Cache verwendet und ist größtenteils in Memory)
Graphdatenbanken
- Knoten sind Entities
- Kanten sind Relationen/Beziehungen
- Bsp: Neo4J
RDF
- Resourcen im Tripel Format: Subjekt-Prädikat-Objekt. "Aachen ist eine Stadt"
Leider gehen mermaid diagramme noch nicht in einer experimentellen version von mdx-remote...
``mermaid graph LR A(Ressource ) -- Eigenschaft --> B(Wert)
- Ressourcen sind: URI, Blank Nodes (URI: Uniform Resource Identifier bsp: `urn:example:animal:ferret:nose`)
- Eigenschaften sind: URI die eine Eigenschaft beschreibt
- Werte sind: URI, Blank Nodes, Literale (Strings interpretiert mit Datentyp `"123"^^http//www.w3.org/2001/XMLSchema#int`)
Leider gehen mermaid diagramme noch nicht in einer experimentellen version von mdx-remote...
{/*
```mermaid
graph LR
HansMueller(Bsp:HansMueller) -- Bsp:hatAdresse --> EmptyNode( )
EmptyNode -- Bsp:hatStrasse --> Strasse("Bsp:Strasse")
EmptyNode -- Bsp:hatPLZ --> PLZ("Bsp:PLZ")
EmptyNode -- Bsp:hatOrt --> Ort("Bsp:Ort")
``` */}
## SPARQL ✨
> "SPARQL steht für "SPARQL Protocol and RDF Query Language"" - DBIS Folien
![Rekursion](https://media.tenor.com/fRjZqbFCKTkAAAAM/pizza-inception.gif)
Ein Abfrage besteht aus folgendem:
- Namespaces (Prefixe)
- `@prefix ex: <http://example.com/resources/>`
- Abfrage Typ
- `SELECT`, `ASK`, `CONSTRUCT`, `DESCRIBE`
- `SELECT ?x | * FROM ...`: FROM ist optional da es nur die durchsuchten Graphen angibt(sonst default Graph)
- `ASK`: Ergebnis ist Wahrheitswert
- `CONSTRUCT`: Ergebnis ist Erzeugung einer Ressource
- `DESCRIBE`: Ergebnis ist Beschreibung einer Ressource
- Abfrage Muster
- `WHERE { ?x ex:hasName "Söder" }`
- Modifikatoren
- `ORDER BY ?x`
Somit ergibt sich eine Abfrage wie folgt:
```sparql
@prefix ex: <http://example.com/resources/>
@prefix foaf: <http://xmlns.com/foaf/0.1/>
@prefix tblw3ccard: <http://www.w3.org/People/Berners-Lee/card#>
@prefix wbsp: <http://mywebspace.com/profiles/john/>
SELECT ?friend ?friendname
WHERE {
wbsp:John foaf:knows ?friend .
?friend foaf:firstname ?friendname .
}
Weiteres:
- Modifikatoren
ORDER BY ASC/DESC ?x
LIMIT n | OFFSET n
: Limitiert die Anzahl der Ergebnisse oder gibt die ersten n Ergebnisse nicht zurück
- Vergleichungen von urls
== | !=
Großschreibungen relevant
- Filter
! | && | ||
Logisch... halt wirklich+ | - | * | /
= | != | < | > | ...
isURI() | isBlank() | isLiteral() | str() | lang() | datatype() | regex() | contains()
OPTIONAL
:{GraphMuster1} OPTIONAL {Optionale Sache}
ähnlich wie left joinUNION
: Selbst erklärendSELECT DISTINCT
: Auch selbst erklärend
Der Rest ist unnütz (denke ich)