Top Up Home HTML2PDF

Pfade fester Länge

Unidirektional -[l:L]-> von rechts nach links

MATCH (h1:Haltestelle {name: 'SpichernStr'})-[l:L]->(h2:Haltestelle)
RETURN h1, l, h2;

Unidirektional <-[l:L]- von links nach rechts

MATCH (h1:Haltestelle {name: 'SpichernStr'})<-[l:L]-(h2:Haltestelle)
RETURN h1, l, h2;

Bidirektional -[l:L]-

MATCH (h1:Haltestelle {name: 'SpichernStr'})-[l:L]-(h2:Haltestelle)
RETURN h1, l, h2;

Tabellarische Ausgabe von Eigenschaften

MATCH (h1:Haltestelle {name: 'SpichernStr'})-[l:L]->(h2:Haltestelle)
RETURN h1.name, h2.name, l.distanz
ORDER BY h1.name, h2.name;

Stop 1

MATCH (s:Stop)-[ih:IH]->(h:Haltestelle {name: 'SpichernStr'})
RETURN s, ih, h;

Stop 2

MATCH 
  (h1:Haltestelle {name: 'SpichernStr'})
  <-[ih1:IH]-(s1:Stop)
  -[n:N]->(s2:Stop)
  -[ih2:IH]->(h2:Haltestelle)
RETURN s1, ih1, h1, n, s2, ih2, h2
ORDER BY s1.abfahrt;

Stop 3

MATCH 
  (h1:Haltestelle {name: 'SpichernStr'})
  <-[:IH]-(s1:Stop WHERE s1.abfahrt > localtime('10:08'))
  -[:N]->(s2:Stop)
  -[:IH]->(h2:Haltestelle)
RETURN 
  h1.name as abfahrtVon, s1.abfahrt as umAbfahrt, 
  h2.name as ankunftAn, s2.ankunft as umAnkunft
ORDER BY s1.abfahrt;

Komplexere Pfade

Problem

  • Stops für Haltestelle h2 ermitteln
  • Haltestelle h2 ist in einen Pfad mit Links -[:L]-> eingebettet
  • Muss in einen weiteren Pfad eingebettet werden <-[:IH]-
  • Das Komma ermöglicht es, Pfadfragmente zu kombinieren
MATCH 
  (h1:Haltestelle {name: 'SpichernStr'})
  -[l1:L]->(h2:Haltestelle)
  -[l2:L]->(h3:Haltestelle {name: 'ZoologischerGarten'}),
  (h2)<-[:IH]-(s:Stop)
RETURN h2.name, s;

Derselbe Effekt kann mit der mehrfachen Verwendung von MATCH erzielt werden

MATCH 
  (h1:Haltestelle {name: 'SpichernStr'})
  -[l1:L]->(h2:Haltestelle)
  -[l2:L]->(h3:Haltestelle {name: 'ZoologischerGarten'})
MATCH
  (h2)<-[:IH]-(s:Stop)
RETURN h2.name, s;

Eindeutigkeit Relationship Matching

MATCH und Komma haben unterschiedliches Verhalten

Variante mit zweimal MATCH

  • In der folgenden Abfrage wird zweimal dieselbe Beziehung durchlaufen
  • Beide MATCHes sind unabhängig voneinander
  • Können bedient werden
MATCH 
  (h1:Haltestelle {name: 'SpichernStr'})
  -[l:L]->
  (h2:Haltestelle  {name: 'AugsburgerStr'})
MATCH 
  (h1)-[l:L]->(h2)
RETURN h1.name, h2.name, l.distanz;

Variante mit Komma

  • Es findet nur ein MATCHing statt
  • Die MATCHing-Semantik von Cypher erlaubt nur, jede Beziehung einmal zu MATCHen
  • D.h., der Ausdruck hinter dem Komma (h1)-[l:L]->(h2) versucht die gleiche Beziehung erneut zu MATCHen
  • Das ist nicht erlaubt
  • Daher kann das gesamte Muster nicht MATCHen
  • Deshalb eine leere Ausgabe
MATCH 
  (h1:Haltestelle {name: 'SpichernStr'})
  -[l:L]->
  (h2:Haltestelle  {name: 'AugsburgerStr'}),
  (h1)-[l:L]->(h2)
RETURN h1.name, h2.name, l.distanz;

Aggregationen / WITH

Die Abfrage ermittelt die Anzahl der Stops pro Haltestelle

  • Damit eine Bedingung für die Anzahl formuliert werden kann, ist WITH notwendig
  • WITH fungiert als Pipeline durch die MATCHes getunnelt werden können
MATCH (s:Stop)-[ih:IH]->(h:Haltestelle)
WITH h.name as haltestelle, count(*) as anzahlStops
WHERE anzahlStops > 1
RETURN haltestelle, anzahlStops;