Comment procéder pour stocker et interroger des graphiques clairsemés dirigés ou non dirigés dans Postgresql. Il y a quelque chose comme pggraph , mais qui est encore au stade de la planification.
Je réalise que les bases de données graphiques dédiées comme Neo4J sont les mieux adaptées à cela. Cependant, existe-t-il un moyen de l'implémenter dans 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
La question est, je pense, beaucoup trop vague et large pour donner une réponse précise ...
Essentiellement, cependant, il existe certaines techniques pour interroger efficacement les données de graphique dans une base de données SQL, qui s'appliquent à des scénarios hautement spécialisés. Vous pouvez choisir de maintenir un index GRIPP, par exemple, si votre intérêt réside dans la recherche des chemins les plus courts. (Il fonctionne essentiellement un peu comme un index d'arbre pré-ordonné, appliqué aux graphiques.) À ma connaissance, aucune de ces techniques n'est encore normalisée.
Cela dit, et en voyant votre commentaire qui mentionne les réseaux sociaux, il y a de fortes chances que chacun d'eux soit exagéré. Si votre intérêt réside principalement dans la récupération de données relatives aux amis d'un utilisateur, ou quelque chose d'équivalent dans le sens où cela revient à interroger le voisinage d'un nœud, le nombre de nœuds que vous devrez parcourir dans les jointures est si petit qu'il n'y a pas besoin de outils spécialisés, structures de données, etc.: utilisez simplement des CTE récursifs.
http://www.postgresql.org/docs/current/static/queries-with.html
Pour des performances optimales lors de l'utilisation de ce dernier, déplacez autant de conditions where
dans la partie with (...)
de la requête, afin d'éliminer précocement les nœuds.
Utilisez PostgreSQL pour le stockage sous-jacent et utilisez networkX ou iGraph via PL/Python pour le moteur de traitement.
Dans leur livre " Graph Databases ", Ian Robinson, Jim Webber et Emil Eifrem font une distinction entre le stockage sous-jacent et le moteur de traitement. Si vous regardez la réponse que j'ai suivie 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 performances par rapport à ma solution d'origine était énorme (et similaire à ceux décrits dans le livre "Graph Databases") et sa mise en œuvre a été très simple.
À ce stade, je recommanderais d'expérimenter avec AgensGraph, une distribution multimodèle prometteuse de PostgreSQL qui offre des bases de données graphiques de première classe et des requêtes à la fois de SQL et de 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.
Puisque la question est générique, j'ajouterais une solution qui peut fonctionner pour la plupart des graphes planaires comme les réseaux de rue, PostgreSQL offre une excellente solution via Postgis topologie . La topologie Postgis stocke les géométries sous forme d'arêtes, de nœuds et de faces et leurs relations relatives. Cela signifie qu'à partir de la géométrie d'un réseau routier, vous pouvez sélectionner des arêtes et leurs nœuds de début et de fin et à partir de là, créer facilement un graphique dans le moteur de traitement de votre choix (networkx ou graph-tool pour Pyhton en sont des exemples).
Comme je l'ai dit, cependant, la topologie Postgresql/Postgis fonctionne lorsque nous voulons étudier des géométries comme les réseaux de rues du point de vue de l'analyse de graphes.