2013-05-01 3 views
6

Mit tinkerpop blueprints API, was ist der beste Weg zu finden, ob eine Kante zwischen zwei Vertices existiert? Ich möchte vertex.getEdges() vermeiden und iterieren, bis ich den richtigen finde.Was ist der richtige Weg, um eine Kante zwischen zwei Ecken zu finden?

Z. B .: Überprüfen Sie, ob v1 Freund von v2 ist

Vertex v1 = g.addVertex(null); 
Vertex v2 = g.addVertex(null); 
Edge edge = g.addEdge(null, v1, v2, "friends"); 
Edge edge = g.addEdge(null, v1, v2, "follows"); 

// Node with lots of edges - Supernode - problem? 
List<Edge> edges = new ArrayList<Edge>(); 
for(Edge edge : g.getVertex(v1.getId()).getEdges(Direction.OUT, "friends")){ 
    if(edge.getVertex(Direction.IN).getId().equals(v2.getId()){ 
     edges.add(edge); 
    } 
} 

ich Vertex Query verwenden sollte?


Via Gremlin konnte ich tun:

g.v(v1.getID()).outE("friends").inV.filter{it.id == v2.getID} 

Neo4j way:

IndexHits<Relationship> relationships = relationshipIndex().get("type", edgeType, node1, node2); 

Danke für die Hilfe! Ich bin noch neu dazu.

+0

Es scheint, dass Sie es mit der Kern-API abrufen können. Warum sollte in diesem Fall der "Overhead" der Blueprints-API verwendet werden? – tstorms

+0

Die Kern-API ist mit Neo4j möglich, aber mit Titan zum Beispiel muss ich direkt Blaupausen verwenden – Luccas

+1

Ich denke, dass Sie auf dem richtigen Weg sind. Verwenden Sie möglichst Vertex-Abfrage- und vertexzentrische Indizes, um die Abfragezeiten zu verbessern. https://github.com/thinkaurelius/titan/wiki/Vertex-Centric-Indices –

Antwort

4
gremlin> g.v(1).bothE.as('x').bothV.retain([g.v(3)]).back('x') 
3

Der back Schritt wie von Huangmao Quan in der Antwort verwendet wird, ist nicht mehr in Tinkerpop verfügbar. Da ich bereits auf diese question geantwortet habe, könnte die folgende Anfrage auf neuere Versionen des TinkerPop-Stacks zutreffen.

g.V().has('propertykey','value1').outE('thatlabel').as('e').inV().has('propertykey','value2').select('e') 
Verwandte Themen