2013-12-25 4 views
20

Как можно хранить и запрашивать разреженные направленные или неориентированные графики в Postgresql. Есть что-то вроде pggraph, но это все еще находится в стадии планирования.Лучший способ моделирования данных графа в postgresql

Я понимаю, что выделенные графы, такие как Neo4J, лучше всего подходят для этого. Однако есть ли способ реализовать то же самое в Postgresql, используя расширение или тип данных, что позволит избежать добавления другой базы данных engine.dtata

+0

В настоящее время потребности очень просты. Возможность моделирования отношений между сущностями и возможность эффективного запроса по графику, избегая объединения. Мой запрос заключается в том, есть ли для этого готовое готовое решение. Я прочитал - [graphs-in-the-database-sql-meet-social-networks] (http://techportal.inviqa.com/2009/09/07/graphs-in-the-database-sql-meets- социальные сети /), но было просто интересно, не хватает ли я какого-то очевидного решения. – jethar

+2

Обычная мудрость, что графические базы данных лучше всего подходят для моделирования данных графа, может быть ошибочной в соответствии с данными исследователями IBM и Google https://research.google.com/pubs/archive/43287.pdf Как это может быть неправильно? Я думаю, это сводится к тому, что postgres просто очень хорошо. Трудно сделать БД, которая может противостоять постгресам в любой категории, и большинство попыток сделать это не удастся, даже для специальных случаев использования. – mako

+0

Привет всем и @mako! Я очень рад видеть вас всех здесь. Этот вопрос так важен для меня, потому что я потратил 3 года на тестирование TitanDB в качестве младшего разработчика с версии от 0.5 до 1.0. У меня очень плохой опыт (проблема во мне?) С этими вещами. Каждый раз, когда я получал некоторые результаты в графическом моделировании, некоторая ошибка происходила и блокировала мое развитие. Но за эти 3 года я создал много проектов на Django + postgres и они lilving. –

ответ

13

Вопрос, я думаю, слишком расплывчатый и широкий, чтобы дать точный ответ ...

По сути, существуют некоторые методы эффективного запроса данных графа в базе данных SQL, которые применяются к узкоспециализированным сценариям. Вы можете выбрать индекс GRIPP, например, если ваши интересы лежат в поиске кратчайших путей. (Он в основном работает немного как предварительно упорядоченный индекс дерева, применяемый к графикам.) Насколько мне известно, ни один из этих методов пока не стандартизирован.

С учетом сказанного и просмотра вашего комментария, в котором упоминаются социальные сети, шансы на то, что каждый из них будет излишним. Если ваш интерес заключается прежде всего в получении данных, относящихся к друзьям пользователя, или в чем-то эквивалентном в том смысле, что он представляет собой запрос к окрестности узла, количество узлов, которые вам нужно пересекать в соединениях, настолько мало, что нет необходимости в специализированные инструменты, структуры данных и т. д .: просто используйте рекурсивные CTE.

http://www.postgresql.org/docs/current/static/queries-with.html

Для достижения оптимальной производительности при использовании последнего, переложить как многие where условия в with (...) части запроса, таким образом, чтобы исключить узлы рано.

+0

Согласен, вопрос расплывчатый, но есть определенная цель безумия.Я начал использовать postgresql за последние 6 месяцев и все еще новичок в его нюансах, плюс я не стал бы считать себя адептом и использовать расширенные темы. Ваша ссылка на рекурсивные CTE полезна, хотя, поскольку она дает полезные подсказки, которые я не смог получить от Google. Я отвечу +1 на ваш ответ, если я не получу дальнейших полезных ответов. Благодарю. – jethar

12

Используйте PostgreSQL для базового хранилища и используйте networkX или iGraph через PL/Python для механизма обработки.

В своей книге «Graph Databases» Ян Робинсон, Джим Уэббер и Эмиль Эйфрем делают различие между базовым хранилищем и механизмом обработки. Если вы посмотрите на ответ, который я выполнил в недавней проблеме (см. here), вы увидите, что я использую PostgreSQL для базового хранилища и networkX в качестве механизма обработки. Производительность по сравнению с моим оригинальным решением была огромной (и аналогичной той, что описана в книге «Базы данных графов»), и ее реализация была очень простой.

+2

Я рекомендую переключиться на использование iGraph, см. Этот тест: http://graph-tool.skewed.de/performance. Я также сделал экстенсивные тесты самостоятельно на данных подграфа facebook. –

Смежные вопросы