2016-04-16 1 views
1

Disons que nous avons une base de données Neo4j avec plusieurs sous-graphes de 50 000 noeuds. Chaque sous-graphe a une racine. Je veux trouver tous les nœuds dans un sous-graphe.Étiquettes et propriétés Neo4j, et leurs différences

Une façon serait de marcher récursivement sur l'arbre. Cela fonctionne mais peut être des milliers de voyages à la base de données.

Une façon est d'ajouter un identifiant de sous-graphe à chaque noeud:

MATCH(n {subgraph_id:{my_graph_id}}) return n 

Une autre façon serait de relier chaque noeud dans un sous-graphe à la racine du sous-graphe:

MATCH(n)-[]->(root:ROOT {id: {my_graph_id}}) return n 

Cela se sent plus " graphie "si cela compte. Cela semble cher.

Ou, je pourrais ajouter une étiquette à chaque noeud. Si {} my_graph_id était « BOBS_QA_COPY », puis

MATCH(n:BOBS_QA_COPY) return n 

serait PELLE tous les nœuds du sous-graphe.

Ma question est quand est-il approprié d'utiliser une propriété de type jardin, d'ajouter des relations ou de définir une étiquette?

Définir une étiquette pour identifier un sous-graphe particulier me fait me sentir bizarre, comme si j'abuse de l'outil. Je m'attends à ce que les étiquettes disent quel quelque chose est, pas quelle instance de quelque chose il est. Par exemple, si nous étions en train de représenter graphiquement des informations sur la voiture, je pourrais voir des parties portant la mention «FORD EXPLORER». Mais je suis moins sûr qu'il serait logique d'avoir des pièces étiquetées "TONYS FORD EXPLORER". Maintenant, je pouvais voir (ID utilisateur: « Tony ») ayant une relation avec un graphique FORD EXPLORER ...

je être d'avoir un combat de « cerveau SQL » ...

+0

50K nœuds, c'est beaucoup - en avez-vous vraiment besoin tous en même temps? –

Répondre

2

Travaillons cela par , pas à pas.

  1. Si des N noeuds non root, en ajoutant une relation supplémentaire N ROOT fait le moindre sens. C'est très cher en stockage, il va polluer le modèle de données avec des relations qui n'ont pas besoin d'être là et qui peuvent compliquer inutilement les requêtes qui veulent traverser les chemins, et ce n'est pas le moyen le plus rapide un sous-graphique.

  2. Ajout d'une propriété ID de sous-graphe à chaque noeud est également coûteux dans le stockage (mais moins), et il faudrait soit: (a) l'analyse chaque nœud pour trouver tous les noeuds avec un identifiant spécifique (lent), ou (b) en utilisant un index, disons, :Node(subgraph_id) (plus rapide). L'approche (b), qui est préférable, exigerait également que tous les nœuds aient la même étiquette Node. Mais attendez, si l'approche 2 (b) exige déjà que tous les nœuds soient étiquetés, pourquoi n'utilisons-nous pas simplement une étiquette différente pour chaque sous-groupe? En faisant cela, nous n'avons pas du tout besoin de la propriété subgraph_id, et nous n'avons pas non plus besoin d'un index! Et trouver tous les nœuds avec la même étiquette est rapide.

Ainsi, l'utilisation d'une étiquette par sous-groupe serait la meilleure option.

+0

Un problème avec un libellé par sous-groupe est que les index sont activés: Label (propriété) - si la fonctionnalité d'index est requise, il faut en créer un pour chaque libellé de sous-groupe. –

+0

@TimKuehn. Ce n'est pas un gros problème s'il n'y a pas beaucoup de sous-groupes. S'il y en a beaucoup, vous pouvez aussi donner à chaque nœud une étiquette commune supplémentaire et l'utiliser pour tous les indices communs. – cybersam