La meilleure façon de modéliser les données graphiques dans postgresql
Comment pourrait-on aller sur le stockage et l'interrogation de éparses dirigé ou non orienté graphiques dans Postgresql. Il y a quelque chose comme pggraph , mais c'est encore en phase de planification.
je réalise que les bases de données graphiques dédiées comme Neo4J sont les mieux adaptées pour cela. Cependant, est-il possible d'implémenter la même chose au sein de Postgresql, en utilisant une extension ou un type de données, ce qui éviterait d'ajouter un autre moteur de base de données.dtata
4 réponses
la Question est, je pense, de façon trop large et vague de donner une réponse précise...
essentiellement, cependant, il existe certaines techniques pour interroger efficacement des données graphiques dans une base de données SQL, qui s'appliquent à des scénarios hautement spécialisés. Vous pouvez choisir de maintenir un index grip, par exemple, si vos intérêts résident dans la recherche des chemins Les plus courts. (Cela fonctionne essentiellement un peu comme l'index d'arbre pré-commandé, appliqué aux graphiques. Le meilleur de ma connaissance, aucune de ces techniques ne sont normalisé encore.
cela dit, et en voyant votre commentaire qui mentionne les réseaux sociaux, il y a de fortes chances que chacun d'entre eux soit surmené. Si votre intérêt réside principalement dans la recherche de données relatives aux amis d'un utilisateur, ou quelque chose d'équivalent dans le sens qu'il s'agit de questionner le voisinage d'un noeud, le nombre de noeuds que vous aurez besoin de traverser dans les jointures est si minuscule qu'il n'y a pas besoin d'outils spécialisés, structures de données, etc.: utilisez simplement des CTEs récursifs.
http://www.postgresql.org/docs/current/static/queries-with.html
pour une performance optimale lors de l'utilisation de ce dernier, déplacez autant de conditions where
dans la partie with (...)
de la requête, de manière à éliminer les noeuds tôt.
utilisez PostgreSQL pour le stockage sous-jacent et utilisez networkX ou iGraph via PL/Python pour le moteur de traitement.
Dans leur livre " Graphique de Bases de données ", Ian Robinson, Jim Webber, et Emil Eifrem faire une distinction entre le stockage sous-jacent et le moteur de traitement. Si vous regardez la réponse que j'ai suivi dans un problème récent( voir ici ), vous verrez que J'utilise PostgreSQL pour le stockage sous-jacent et networkX comme moteur de traitement. Le gain de performance par rapport à ma solution originale était énorme (et similaire à ceux décrits dans le livre "bases de données graphiques") et sa mise en œuvre était très facile.
puisque la question est générique, je voudrais ajouter une solution qui peut fonctionner pour la plupart des graphiques planaires comme les réseaux de rue, PostgreSQL offre une excellente solution à travers Postgis topologie . La topologie Postgis stocke les géométries comme les arêtes, les noeuds et les visages et leurs relations relatives. Cela signifie que de la géométrie d'un réseau de rue, vous pouvez sélectionner les bords et leurs noeuds de début et de fin et de ce construire facilement un graphe dans le moteur de traitement de votre choix (networkx ou graph-tool pour Pyhton sont des exemples).
comme je l'ai dit, cependant, la topologie Postgresql/Postgis fonctionne quand nous voulons étudier les géométries comme les réseaux de rue du point de vue de l'analyse de graphe.
à ce stade, je recommande d'expérimenter avec AgensGraph, une distribution multimodelle prometteuse de PostgreSQL qui offre des bases de données graphiques de première classe et des requêtes de SQL et Cypher. Notez qu'il s'agit d'un serveur complet, et non D'une extension comme PostGIS, bien que des extensions PostgreSQL puissent y être ajoutées.