2010-03-11 6 views
1

Il s'agit d'un graphe dont les nœuds existent dans de nombreux composants connectés à la fois, car les relations d'un nœud sont une collection de groupes de bords, de sorte qu'un seul front peut être présent en même temps. Je dois être capable de trouver tous les composants connectés dans lesquels un nœud existe. Quelle serait la meilleure façon de stocker ce graphique dans neo4j pour trouver rapidement tous les composants connectés dans lesquels un nœud existe? Existe-t-il un moyen d'utiliser les traversées intégrées pour ce faire?Comment puis-je stocker ce type de graphique dans neo4j pour une traversée rapide?

Aussi: y a-t-il un nom pour ce type de graphique? J'apprécierais n'importe quelle aide/idées.

Mise à jour:

Désolé de ne pas être clair. Tous les nœuds sont du même type. Les noeuds ont un nombre variable de groupes de bords. Exactement un bord de chaque groupe de bord doit être choisi pour un composant connexe particulier. Je vais essayer d'expliquer par l'exemple:

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) 

Alors premier groupe de bord x1 est (x2, x3, x4), son deuxième groupe de bord est (x5, x6), et son groupe de troisième bord est (x7).

Alors voici quelques composants connectés qui x1 existe dans:

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.

Je suis reconnaissant pour votre aide dans ce domaine.

Update2:

Je pense que je serai en mesure de le faire s'il y a une réponse à cette question: How can I specify which relationship type to use as a function of the current node at every step of a traversal with neo4j?

Répondre

1

Ils Je comprends ainsi votre question que vous avez un certain nombre de noeuds, nous allons appelez-les X nœuds, qui sont connectés à un certain nombre de nœuds de type (ou quelque chose de similaire), appelons ces nœuds nœuds T. Un nœud X peut avoir des connexions à plusieurs nœuds T, mais seulement une connexion à chaque nœud T, ou peut-être seulement une connexion à chaque nœud du nœud T (votre description est un peu floue ici).

La façon dont je modéliserais ceci est en utilisant un RelationshipType pour chaque (type de) nœud T. Ensuite, vous pouvez utiliser x_node.getRelationships (T_TYPE_ONE, T_TYPE_TWO, ... etc ...) pour obtenir tous les nœuds T d'un nœud X. Quand vous mutez un nœud X, c'est là que vous devez maintenir votre invariant qu'il ne peut avoir au plus qu'une relation avec chaque (type de) nœud T. Vous faites cela en utilisant x_node.getSingleRelationship (THE_T_TYPE_YOURE_MUTATING), si cela renvoie null, il est prudent d'ajouter une nouvelle relation de ce type, si elle renvoie une relation, vous devrez l'enlever avant de pouvoir ajouter la nouvelle.

exemple ASCII-art de ce modèle (comme je l'interprète):

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

Dans l'exemple ci-dessus les deux noeuds X font partie de la composante T_ONE, mais x1 fait partie du composant de T_ONE T1A et x2 est une partie de t1b. Ils font tous deux partie de T_THREE composant t3a, alors x1 fait partie du composant T_TWO t2a, et x2 fait partie du composant T_FOUR t4a. Interrogation dans cet exemple ressemblerait à quelque chose comme:

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

et mise à jour ressemblerait à ceci:

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

S'il vous plaît laissez-moi savoir si je l'ai mal interprété vos besoins, et je serai heureux de donner votre description mise à jour un coup de poignard.

+0

J'ai mis à jour la description pour plus de clarté. Je vous remercie! – James

+0

Je pense que la solution que j'ai proposée est toujours valide avec la description du problème mise à jour. – thobe