una relaciones para pagina oficial modificar grafos grafo graficas downloads datos crear como bases neo4j subgraph

relaciones - Extracto del subgrafo en neo4j



neo4j downloads (3)

En cuanto a la coincidencia de gráficos, ha sido reemplazada por http://docs.neo4j.org/chunked/snapshot/cypher-query-lang.html, que se ajustaría muy bien, y admite coincidencias difusas con relaciones opcionales.

Para la representación subgráfica, usaría la salida Cypher para quizás construir nuevas instrucciones Cypher para recrear el gráfico, al igual que una exportación SQL, algo así como

start n=node:node_auto_index(name=''Neo'') match n-[r:KNOWS*]-m return "create ({name:''"+m.name+"''});"

http://console.neo4j.org/r/pqf1rp para un ejemplo

Tengo una gran red almacenada en Neo4j. Basado en un nodo raíz particular, quiero extraer un subgráfico alrededor de ese nodo y almacenarlo en otro lugar. Entonces, lo que necesito es el conjunto de nodos y bordes que coinciden con mis criterios de filtro.

Afaik no tiene disponible una solución lista para usar. Hay un componente de coincidencia de gráficos disponible , pero solo funciona para coincidencias perfectas. La API Neo4j en sí misma define solo el cruce de gráficos que puedo usar para definir qué nodos / bordes deben visitarse:

Traverser exp = Traversal .description() .breadthFirst() .evaluator(Evaluators.toDepth(2)) .traverse(root);

Ahora, puedo agregar todos los nodos / bordes a los conjuntos para todas las rutas, pero esto es muy ineficiente. ¿Como lo harias? ¡Gracias!

EDITAR ¿Tendría sentido agregar el último nodo y la última relación de cada cruce al subgráfico?


Lo resolví construyendo el subgráfico inducido basado en todos los puntos finales transversales.

Crear el subgrafo desde el conjunto de los últimos nodos y bordes de cada cruce no funciona, porque los bordes que no forman parte de las rutas más cortas no se incluirán.

El fragmento de código se ve así:

Set<Node> nodes = new HashSet<Node>(); Set<Relationship> edges = new HashSet<Relationship>(); for (Node n : traverser.nodes()) { nodes.add(n); } for (Node node : nodes) { for (Relationship rel : node.getRelationships()) { if (nodes.contains(rel.getOtherNode(node))) edges.add(rel); } }

Cada borde se agrega dos veces. Una vez para el nodo saliente y una vez para el nodo entrante. Usando un Set, puedo asegurarme de que esté en la colección solo una vez.

Es posible iterar solo sobre los bordes entrantes / salientes, pero no está claro cómo se manejan los bucles (borde de un nodo a sí mismo). ¿A qué categoría pertenecen? Este fragmento no tiene este problema.