Cypher ist eine deklarative Abfragesprache für Graphen, die expressive und effiziente Abfragen und Aktualisierungen auf sogenannten Property-Graphen[1] ermöglicht. Cypher ist eine relativ einfache und dennoch mächtige Sprache. Selbst sehr komplizierte Datenbankabfragen können mit Hilfe von Cypher einfach formuliert werden. Dies erlaubt Nutzern, sich auf ihr eigentliches Ziel zu konzentrieren, anstatt sich in der Datenbank zu verlieren.[2]
Cypher war hauptsächlich eine Erfindung von Andrés Taylor, die er 2011 während seiner Arbeit für die Neo4j, Inc. (früher „Neo Technology“) machte.[3] Cypher war ursprünglich dafür gedacht, mit der Graph-Datenbank Neo4j benutzt zu werden, wurde jedoch durch das openCypher-Projekt im Oktober 2015 in die Open-Source-Welt überführt.[4]
Cypher beruht auf dem Property-Graph-Modell, welches zusätzlich zu den Standard-Graph-Elementen Knoten (englisch „nodes“) und Kanten (englisch „edges“; welche in Cypher Beziehungen – englisch „relationships“ – heißen) Etiketten (englisch „labels“) und Eigenschaften (englisch „properties“) als Konzepte einführt. Knoten können keine oder viele Etiketten haben, während Beziehungen genau einen Beziehungstyp haben.[5] Knoten und Beziehungen haben auch keine oder viele Eigenschaften, bei denen Eigenschaften aus Schlüssel (englisch „key“) und Wert (englisch „value“) bestehen und den aus einer Zeichenkette (englisch „string“) bestehenden Schlüssel an einen Wert aus dem Typsystem von Cypher binden.
Das Typsystem von Cypher enthält Knoten, Beziehungen (Kanten), Pfade (englisch „paths“), Karten (englisch „maps“), Listen (englisch „lists“), Ganzzahlen (englisch „integers“), Gleitkommazahlen (englisch „floating point numbers“), logische Werte (englisch „booleans“) und Zeichenketten.[6]
Cypher enthält eine Vielzahl von Klauseln. Die gebräuchlichsten sind „MATCH“ und „WHERE“. Diese haben eine leicht abweichende Funktionalität von der aus der Datenbankabfragesprache SQL bekannten. MATCH wird für die Beschreibung der Struktur des gesuchten Musters (englisch „pattern“) verwendet, das primär auf Beziehungen beruht. WHERE wird verwendet, um zusätzliche Bedingungen (englisch „constraints“) für die Muster zu definieren.[7] Die folgende Abfrage wird zum Beispiel alle Filme als Antwort zurückgeben, in denen eine Schauspielerin 'Nicole Kidman' mitspielte, und die vor einem bestimmten (durch einen Parameter übergebenen) Jahr produziert wurden:
MATCH (nicole:Actor {name: 'Nicole Kidman'})-[:ACTED_IN]->(movie:Movie)
WHERE movie.year < $yearParameter
RETURN movie
Zusätzlich enthält Cypher Klauseln für das Schreiben, Aktualisieren und Löschen von Daten. „CREATE“ und „DELETE“ werden verwendet, um Knoten und Beziehungen zu erstellen bzw. zu löschen. „SET“ und „REMOVE“ werden verwendet, um Werte von Eigenschaften und Etiketten von Knoten zu setzen bzw. zu entfernen. Knoten können nur gelöscht werden, wenn sie keine Beziehungen (zu anderen Knoten) haben. Ein Beispiel:[7]
MATCH (start:Content)-[:RELATED_CONTENT]->(content:Content)
WHERE content.source = 'user'
OPTIONAL MATCH (content)-[r]-()
DELETE r, content
Mit dem openCypher-Projekt wurde der Versuch gestartet, Cypher als Standard-Abfragesprache bei der Graph-Verarbeitung zu etablieren. Ein Teil des Prozesses war das First openCypher Implementers Meeting (oCIM), welches erstmals im Dezember 2016 angekündigt wurde.[8][9]