Database Reference
In-Depth Information
Die Macht der Pipes
Sie können sich Gremlin-Operationen als eine Folge von Pipes vorstellen.
Jede Pipe nimmt eine Collection als Eingabe und liefert eine Collection als
Ausgabe. Eine Collection kann ein Element, viele Elemente oder auch gar
kein Element enthalten. Die Elemente können Knoten, Kanten oder Property-
Werte sein.
Zum Beispiel nimmt die outE -Pipe eine Collection von Knoten und gibt eine
Collection von Kanten weiter. Diese Folge von Pipes wird als Pipeline bezeich-
net und drückt das Problem deklarativ aus. Vergleichen Sie das mit einem ty-
pischen imperativen Programmier-Ansatz, bei dem Sie die Schritte beschrei-
ben müssen, die zur Lösung des Problems notwendig sind. Die Verwendung
von Pipes ist eine der kompaktesten Möglichkeiten, eine Graph-Datenbank
abzufragen.
Im Innersten ist Gremlin eine Sprache, mit der solche Pipes aufgebaut wer-
den können. Genauer gesagt baut sie auf einem Java-Projekt namens Pipes
auf. Um das Pipe-Konzept zu untersuchen, wollen wir zu unserem Wein-
Graphen zurückkehren. Nehmen wir an, Sie wollen Weine finden, die einem
gegebenen Wein entsprechen - d. h. von der gleichen Sorte sind. Wir kön-
nen einem Eiswein folgen, der ebenfalls eine grape _ type -Kante zu anderen
Knoten enthält (wobei wir den Anfangsknoten ignorieren).
ice _ wine = g.v(0)
ice _ wine.out('grape _ type').in('grape _ type').filter{ !it.equals(ice _ wine) }
Wenn Sie bei Smalltalk oder Rails mit Geltungsbereichen gearbeitet haben,
wird Ihnen diese Form der Methodenverkettung vertraut vorkommen. Ver-
gleichen Sie nun das obige Beispiel mit der nachfolgenden, normalen Neo4j
Java-API, bei der man die Beziehungen der Knoten durchgehen muss, um
auf die Sorten-Knoten zugreifen zu können.
enum WineRelationshipType implements RelationshipType {
grape _ type
}
import static WineRelationshipType.grape _ type;
public static List <Node> same _ variety( Node wine ) {
List<Node> wine _ list = new ArrayList <Node>();
// Alle ausgehenden Kanten dieses Knotens durchgehen
for ( Relationship outE : wine.getRelationships( grape _ type ) ) {
// Alle eingehenden Kanten des ausgehenden Knotens dieser Kante durchgehen
for ( Edge inE : outE.getEndNode().getRelationships( grape _ type ) ) {
// Nur Knoten aufnehmen, die nicht dem angegebenen Knoten entsprechen
if ( !inE.getStartNode().equals( wine ) ) {
wine _ list.add( inE.getStartNode() );
}
Search WWH ::




Custom Search