Pregunta

Este es un gráfico cuyos nodos existir en muchos componentes conectados a la vez porque las relaciones de un nodo son una colección de grupos de borde de manera que solamente uno de los bordes por grupo borde puede estar presente a la vez. Tengo que ser capaz de encontrar todos los componentes conectados que existe un nodo en. ¿Cuál sería la mejor manera de almacenar este gráfico en Neo4j para encontrar rápidamente todos los componentes conectados que existe un nodo en? ¿Hay una manera de utilizar el construido en recorridos para hacer esto?

También: ¿hay un nombre para este tipo de gráfica? Te agradecería cualquier ayuda / ideas.

Actualización:

Lo siento por no ser clara. Todos los nodos son del mismo tipo. Los nodos tienen un número variable de grupos de borde. Exactamente un borde de cada grupo de borde debe ser elegido para un componente conectado particular. Voy a tratar de explicar a través del ejemplo:

Node x1 is related to: (x2 or x3 or x4) AND (x5 or x6) AND (x7)
Node x2 is related to: (x8) AND (x9 or x10)

Así primer grupo borde de x1 es (x2, x3, x4), su segundo grupo de borde es (x5, x6), y su borde tercer grupo es (x7).

Así que aquí hay algunos componentes conectados que x1 existe en:

CC1:

x1 is related to: x2, x5, x7
x2 is related to: x8 x9 

CC2:

x1 is related to: x2, x6, x7
x2 is related to: x8, x9

CC3:

x1 is related to: x3, x5, x7

CC4:

x1 is related to: x3, x6, x7

etc.

Estoy agradecido por su ayuda en este.

Actualización 2:

Creo que voy a ser capaz de hacer esto si hay una respuesta a esta pregunta: ¿Cómo puedo especificar qué tipo de relación que se utilizará como una función del nodo actual en cada paso de un recorrido con Neo4j?

¿Fue útil?

Solución

La forma en que entender su pregunta que usted tiene un número de nodos, llamémoslos X nodos , que están conectados a una serie de nodos tipo (o algo similar), vamos a llamar a estos nodos T nodos . Un nodo X puede tener conexiones a múltiples nodos T, pero sólo una conexión a cada nodo T, o, posiblemente, sólo una conexión a cada tipo del nodo T (su descripción es un poco borrosa aquí).

La forma en que volvería a modelar esto es mediante el uso de uno RelationshipType para cada nodo T (tipo de). A continuación, puede utilizar x_node.getRelationships (T_TYPE_ONE, T_TYPE_TWO, ... etc ...) para obtener todos los nodos de T a partir de un nodo X. Al mutar un nodo X es donde se necesita para mantener su invariante que sólo puede tener como máximo una relación entre el nodo T (tipo de). Esto se hace mediante el uso de x_node.getSingleRelationship (THE_T_TYPE_YOURE_MUTATING), en caso de que devuelve un valor nulo, es seguro para agregar una nueva relación de ese tipo, si se devuelve una relación, usted tendrá que quitar antes de poder añadir el nuevo.

ejemplo ASCII-art de este modelo (como lo interpreto):

(x1)--T_ONE-->(t1a)   (t1b)<--T_ONE--(x2)--T_FOUR-->(t4a)
 |\                                   |
 \ |---T_TWO-->(t2a)                 /
  \                                 /
   |---T_THREE-->(t3a)<--T_THREE---/

En el ejemplo anterior ambos nodos X son parte de los componentes t_one, pero x1 es parte del componente t_one T1a y x2 es parte de T1b. Ambos forman parte del componente T_THREE t3a, entonces x1 es parte del componente T_TWO T2a, y x2 es parte del componente T_FOUR t4a. Consulta en este ejemplo sería algo como:

Iterable<Relationship> x1_comps = x1.getRelationships(T_ONE, T_TWO, T_THREE, T_FOUR);
Iterable<Relationship> x2_comps = x2.getRelationships(T_ONE, T_TWO, T_THREE, T_FOUR);

y actualización se vería así:

void setComponent(Node xNode, RelationshipType tType, Node tNode) {
    Relationship current = xNode.getSingleRelationship(tType);
    if (current != null) current.delete();
    xNode.createRelationshipTo(tNode, tType);
}

Por favor, hágamelo saber si he malinterpretado sus necesidades, y estaré feliz de dar su descripción actualizada una puñalada.

Otros consejos

En cuanto a la otra consulta, he señalado algunas posibilidades para las funciones de grano fino a ¿Cómo puedo especificar qué tipo de relación que se utilizará como una función del nodo actual en cada paso de un recorrido con Neo4j? Básicamente, no utilice un traverser pero el node.getRelationship * API más directa y construir su propia iteración para el control de grano fino.

¿Tiene que resolver su problema?

/ Peter Neubauer

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top