# Graph-Datenbanken

- basiert auf Beziehungen
- Schemalos und flexibel
- Joins müssen nicht teuer berechnet werden
- Sharding aufwändig

## Knoten
- repräsentieren Objekte
- eindeutiger Identifier
- können mit einer Menge von Typen und Attributen verknüpft werden

## Kanten
- Beziehungen zwischen Knoten
- eindeutiger Identifier
- genau einen Typ
- können mit einer Menge von Attributen verknüpft werden
- haben Start-, Endknoten und eine Richtung

## Attribut
- Key-Value-Paare
- Key ist ein String
- Value ist ein atomarer Wert eines primitiven Datentyps

## Beispiele
```cypher
MATCH (tom:Person {name:"Tom Hanks"})-[r:ACTED_IN]->(m)
WHERE m.released >= 1900 AND m.released < 2000
RETURN tom,m;
```
```cypher
CREATE (TheMatrix:Movie {title:'The Matrix', released:1999, Tagline:'Welcome to the Real World’})
```
```cypher
CREATE (Keanu)-[:ACTED_IN {roles:['Neo']}]->(TheMatrix)
```


## Allgemeine Syntax
-  Knoten: „(“ variable? (“:“ label)* properties? „)“
  -  label: alle müssen erfüllt werden
  -  properties: {k:v, k:v, ...}, alle müssen erfüllt werden
-  Kanten: ( „-“ | „<-“) („[„ kantenDetails „]“)? („-“ | „->“)
  -  Kantendetails:
    - Variablenname
    - :label – Liste von Typen (getrennt durch „|“; nur ein Typ muss erfüllt werden)
    - Pfadlänge – Beispiele: *, *4, *2..4, *..6
    - properties – siehe Knoten