2013-05-01 12 views
6

Przy użyciu tinkerpop blueprints API, jaki jest najlepszy sposób, aby znaleźć krawędź między dwoma wierzchołkami? Chciałbym uniknąć vertex.getEdges() i iterować, aż znajdę właściwy.Jaki jest właściwy sposób na znalezienie krawędzi między dwoma wierzchołkami?

Np .: Sprawdź, czy v1 jest przyjacielem v2

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); 
    } 
} 

powinienem używać Vertex Query?


Via gremlin mogłem zrobić:

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

Neo4j way:

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

Dzięki za pomoc! Jestem wciąż nowy w tym.

+0

Wygląda na to, że można go pobrać za pomocą podstawowego interfejsu API. Po co korzystać z "nadmiarowego" interfejsu API blueprints w tym przypadku? – tstorms

+0

Podstawowe API jest możliwe z Neo4j, ale na przykład z Titanem, potrzebuję użyć bezpośrednio planów – Luccas

+1

Myślę, że jesteś na dobrej drodze. Użyj wskaźników Vertex i indeksów vertex centric, jeśli to możliwe, aby poprawić czasy zapytań. https://github.com/thinkaurelius/titan/wiki/Vertex-Centric-Indices –

Odpowiedz

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

Etap back stosowane w odpowiedzi przez Huangmao Quan nie jest już dostępna w Tinkerpop. Jak już odpowiedziałem na to question następujące żądanie może dotyczyć nowszych wersji stosu tinkerpop.

g.V().has('propertykey','value1').outE('thatlabel').as('e').inV().has('propertykey','value2').select('e') 
Powiązane problemy