2013-05-01 5 views
6

Utilizzo di tinkerpop blueprints API, qual è il modo migliore per scoprire se esiste uno spigolo tra due vertici? Vorrei evitare vertex.getEdges() e iterare fino a trovare quello giusto.Qual è il modo giusto per trovare uno spigolo tra due vertici?

Es .: controllo se v1 è amico di 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); 
    } 
} 

Dovrei usare Vertex Query?


Via gremlin che potevo fare:

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

Neo4j way:

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

Grazie per l'aiuto! Sono ancora nuovo in questo.

+0

Sembra che tu sia in grado di recuperarlo con l'API di base. Perché utilizzare il "sovraccarico" dell'API blueprints in questo caso? – tstorms

+0

L'API di base è possibile con Neo4j, ma con Titan ad esempio, ho bisogno di utilizzare direttamente i progetti – Luccas

+1

Penso che tu sia sulla strada giusta. Utilizzare gli indici Vertex e vertex centric, se possibile, per migliorare i tempi di interrogazione. https://github.com/thinkaurelius/titan/wiki/Vertex-Centric-Indices –

risposta

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

Il back passo come usato nella risposta da Huangmao Quan non è più disponibile in Tinkerpop. Poiché ho già risposto a questo question, la seguente richiesta potrebbe essere applicata a versioni più recenti dello stack tinkerpop.

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