guidopj / rentauto

Base para todos los TP de la materia
0 stars 13 forks source link

listaDeAmigosDeUnUsuario devuelve varias veces el mismo resultado, incluido el nodo raiz #22

Open aitrusgit opened 8 years ago

aitrusgit commented 8 years ago

Aca surgen varias observaciones:

  1. Es util siempre utilizar Set en lugar de List en los casos en los que no importa tanto el orden con el que se recorren ciertos elementos sino la unicidad de los mismos.
graphDb.traversalDescription()
            .breadthFirst()
            .relationships(Relacion.AMISTAD)
            .evaluator(Evaluators.excludeStartPosition)
            .traverse(n)

Lo que obtienen es una lista de Paths. Un Path, segun neo4j, es el camino desde el nodo inicial hasta el nodo final, con todas las relaciones listadas y nodos intermedios. Ustedes al hacer path.nodes basicamente obtienen TODOS los nodos para en un Path dado y los agregan a la lista resultados. Eso casualmente es lo que ocasiona el problema de duplicidad.

Imaginen un grafo muy sencillo

A -> B -> C -> D

Si arrancan desde A van a obtener los siguientes Paths A -> B A -> B -> C A -> B -> D

si agregan todos los nodos de cada path a una lista, terminan con: [A, B, A, B, C, A, B, D]

La forma mas sencilla de resolver eso es pedirle a Neo4j que nos devuelva el mismo la coleccion de todos los nodos alcanzados, en lugar de los paths

graphDb.traversalDescription()
            .breadthFirst()
            .relationships(Relacion.AMISTAD)
            .evaluator(Evaluators.excludeStartPosition)
            .traverse(n)
                .nodes()

(fijense casi al final de esta docu http://neo4j.com/docs/stable/tutorial-traversal-java-api.html)