2016-05-21 10 views
1

Ich verwende Orientdb 2.2.0 zusammen mit TinkerPop 2.6.0 und Java 8.Wie getippt erhalten Vertex von Gremlin Pipeline mit Hilfe von Java

Ich habe eine Probe Diagramm, das eingerichtet ist, wie folgt: City - --LOCATED_IN ---> Land.

Sowohl Stadt als auch Land implementieren com.tinkerpop.frames.VertexFrame.

Wenn ich eine FramedGraph ich sehr leicht für ein bestimmtes Land abfragen kann und eine typisierte Iterable zurück, zum Beispiel wie folgt aus:

Iterable<Country> countries = framedGraph.getVertices("countryCode", "NL", Country.class); 

Dieses perfekt funktioniert.

Jetzt wollte ich die gleiche Art von Sache erreichen, aber dann mit Gremlin, damit ich kompliziertere Abfragen machen kann. Also als einen einfachen Test wollte ich testen und sehen, ob ich die Städte des Landes, die ich mit der vorherigen Aussage holte, mit Gremlin holen konnte.

Vertex nl = countries.iterator().next().asVertex(); 

GremlinPipeline<Vertex, Vertex> pipe = new GremlinPipeline<>(); 

pipe.start(nl).inE("LOCATED_IN").outV(); 

for (Vertex v : pipe) { 
    System.out.println(v.getProperty("name").toString()); 
} 

Jetzt funktioniert dies, ich die folgende Ausgabe zurück:

Nijmegen 
Nieuw-Vennep 
Niewegein 
Sittard 
Sittard 
Noordwijk 
Lisse 

Was ich aber erreichen möchte ist Stadt statt Vertex Objekte Objekte aus der Pipeline, um wieder (wie bei der FramedGraph Abfrage).

Es scheint, die Pipeline die richtigen Typen zurückkehrt, denn wenn ich den Code leicht auf das zu ändern:

Vertex nl = countries.iterator().next().asVertex(); 

GremlinPipeline<Vertex, Vertex> pipe = new GremlinPipeline<>(); 

pipe.start(nl).inE("LOCATED_IN").outV(); 

for (Vertex v : pipe) { 
    System.out.println(v); 
} 

ich zurück

:

v(City)[#38:3] 
v(City)[#40:3] 
v(City)[#37:3] 
v(City)[#36:3] 
v(City)[#33:4] 
v(City)[#35:3] 
v(City)[#39:3] 

So Eckpunkten Ich bin immer wieder von Geben Sie Stadt ein. Aber wenn ich versuche, dies zu tun:

Vertex nl = countries.iterator().next().asVertex(); 

GremlinPipeline<Vertex, City> pipe = new GremlinPipeline<>(); 

pipe.start(nl).inE("LOCATED_IN").outV(); 

for (City v : pipe) { 
    System.out.println(v); 
} 

ich:

java.lang.ClassCastException: com.tinkerpop.blueprints.impls.orient.OrientVertex cannot be cast to models.City 

Auch wenn ich dies versuchen:

Vertex nl = countries.iterator().next().asVertex(); 

GremlinPipeline<Vertex, City> pipe = new GremlinPipeline<>(); 

pipe.start(nl).inE("LOCATED_IN").outV().cast(City.class); 

for (City v : pipe) { 
    System.out.println(v); 
} 

ich die gleiche Klasse Guss Ausnahme erhalten.

Ich mache offensichtlich etwas falsch, aber ich kann nicht herausfinden, was. Alle Hinweise wären sehr willkommen!

Vielen Dank im Voraus, Jonck

Antwort

2

Ok, nachdem einige mehr lesen fand ich die Antwort auf meine eigene Frage. Ich musste die Scheitelpunkte, die ich aus der Pipeline bekommen hatte, "einrahmen". So

wie folgt:

Vertex nl = countries.iterator().next().asVertex(); 

GremlinPipeline<Vertex, Vertex> pipe = new GremlinPipeline<>(); 

pipe.start(nl).inE("LOCATED_IN").outV(); 

Iterable<City> cities = framedGraph.frameVertices(pipe, City.class); 

for (City city : cities) { 
    System.out.println(city.getName()); 
} 

Und jetzt habe ich den Ausgang zurück ich erwartet hatte. Hoffe, das hilft jemandem.