Графовые базы данных и триплеты RDF: хранение графических данных в python - PullRequest
19 голосов
/ 20 августа 2009

Мне нужно разработать графовую базу данных на python (я был бы рад, если бы кто-нибудь мог присоединиться ко мне в разработке. У меня уже есть немного кода, но я бы с удовольствием обсудил это).

Я провел исследование в интернете. в Java кандидатом является neo4j , но я не смог найти ничего о реальном дисковом хранилище. В python существует много моделей данных графа (см. Это предложение перед PEP, но ни одна из них не удовлетворяет мою потребность хранить и извлекать данные с диска.

Однако я знаю о триплетах. Триплеты - это, в основном, базы данных RDF, поэтому графическая модель данных может быть отображена в RDF и сохранена, но я, как правило, не уверен (в основном из-за отсутствия опыта) в этом решении. Одним из примеров является Сезам . Факт заключается в том, что в любом случае вам необходимо преобразовать представление графа в памяти в представление RDF и наоборот в любом случае, если только клиентский код не хочет напрямую взломать документ RDF, что в большинстве случаев маловероятно. Это было бы похоже на непосредственную обработку кортежей БД вместо создания объекта.

Каков современный уровень хранения и поиска ( а-ля СУБД) графических данных в python, на данный момент? Имеет ли смысл начинать разработку реализации, надеемся, с помощью кого-то, кто в этом заинтересован, и в сотрудничестве с разработчиками PEP Graph API? Обратите внимание, что это будет частью моей работы на следующие месяцы, поэтому мой вклад в этот возможный проект чертовски серьезен;)

Редактировать : Найдено также directededge , но, похоже, это коммерческий продукт

Ответы [ 7 ]

6 голосов
/ 02 января 2010

Я использовал как Jena , который является фреймворком Java, так и Allegrograph (привязки Lisp, Java, Python). У Джены есть дочерние проекты для хранения графических данных, и она существует уже очень давно. Аллегрограф довольно хорош и имеет бесплатную версию, думаю, я бы посоветовал это сделать, потому что ее легко установить, бесплатно, быстро, и вы могли бы начать работу в кратчайшие сроки. Мощь, которую вы получите от изучения небольшого количества RDF и SPARQL, вполне может стоить вашего времени. Если вы уже знаете SQL, то у вас хорошее начало. Возможность запроса вашего графика с использованием SPARQL принесет вам большие преимущества. Сериализация в RDF-тройки была бы простой, а некоторые форматы файлов очень просты (например, NT). Я приведу пример. Допустим, у вас есть следующие идентификаторы node-edge-node графа:

1 <- 2 -> 3
3 <- 4 -> 5

это уже объектная форма предиката, поэтому просто добавьте к ней некоторую запись URI, загрузите ее в тройное хранилище и запросите по желанию через SPARQL. Вот это в формате NT:

<http://mycompany.com#1> <http://mycompany.com#2> <http://mycompany.com#3> .
<http://mycompany.com#3> <http://mycompany.com#4> <http://mycompany.com#5> .

Теперь запросите для всех узлов два прыжка из узла 1:

SELECT ?node
WHERE {
    <http://mycompany.com#1> ?p1 ?o1 .
    ?o1 ?p2 ?node .
}

Это, конечно, даст <<a href="http://mycompany.com#5" rel="noreferrer">http://mycompany.com # 5 >.

Другим кандидатом будет Мулгара , написанный на чистой Java. Поскольку вы, кажется, больше интересуетесь Python, я думаю, что вам следует сначала взглянуть на Allegrograph.

3 голосов
/ 20 августа 2009

Я думаю, что решение действительно зависит от того, что именно вы хотите сделать с графиком после того, как вам удалось сохранить его на диске / в базе данных, и это немного неясно в вашем вопросе. Тем не менее, пара вещей, которые вы могли бы рассмотреть:

  • Если вы просто хотите сохранить график без использования каких-либо функций или свойств, которые можно ожидать от решения rdbms (например, ACID), то как насчет простого объединения объектов в плоский файл? Очень элементарно, но, как я уже сказал, зависит именно то, чего вы хотите достичь.
  • ZODB - это объектная база данных для Python (я думаю, что это выход из проекта Zope). Я не могу сказать, что у меня было много опыта в высокопроизводительной среде, но запрет на некоторые ограничения действительно позволяет вам хранить объекты Python изначально.
  • Если вы хотите использовать RDF, существует проект RDF Alchemy , который может помочь вам решить некоторые проблемы, связанные с преобразованием вашего графа в структуры RDF, и я думаю, что Sesame является частью его стека.

Есть несколько других инструментов персистентности , подробно описанных на сайте python, которые могут представлять интерес, однако я потратил немало времени на изучение этой области в прошлом году, и в конечном итоге обнаружил, что Python отсутствует. решение, которое соответствует моим требованиям.

Наибольшим успехом я пользовался MySQL с пользовательским ORM, и я опубликовал пару соответствующих ссылок в ответ на на этот вопрос . Кроме того, если вы хотите внести свой вклад в проект RDBMS, когда я говорил с кем-то из Open Query о движке хранения графиков для MySQL , им показалось, что они заинтересованы в активном участии в своем проекте.

Извините, я не могу дать более точный ответ, но я не думаю, что он есть ... Если вы начнете разрабатывать свою собственную реализацию, мне будет интересно быть в курсе того, как вы ладить.

2 голосов
/ 13 февраля 2011

Привет от вашего интеллектуального агента Serius Cybernetics!

Несколько полезных ссылок ...

1 голос
/ 03 сентября 2009

Относительно Neo4j, вы заметили существующие привязки Python ? Что касается дискового хранилища, взгляните на этот поток в списке рассылки .

Для graphdbs в Python проект Система управления базами данных Hypergraph был недавно запущен в SourceForge Морисом Лингом .

1 голос
/ 20 августа 2009

Хм, может, стоит взглянуть на CubicWeb

0 голосов
/ 16 июля 2018

RDFLib - это библиотека Python, которую вы можете использовать. Используя пример harschware:

Создайте файл test.nt, как показано ниже:

<http://mycompany.com#1> <http://mycompany.com#2> <http://mycompany.com#3> .
<http://mycompany.com#3> <http://mycompany.com#4> <http://mycompany.com#5> .

Чтобы запросить для всех узлов два прыжка из узла 1 в RDFLib:

    from rdflib import Graph

    g = Graph()
    g.parse("test.nt", format="nt")

    qres = g.query(
        """SELECT ?node
        WHERE {
            <http://mycompany.com#1> ?p1 ?o1 .
            ?o1 ?p2 ?node .
        }"""
    )

    for row in qres:
        print(node)

должен вернуть ответ <http://mycompany.com#5>.

0 голосов
/ 17 июля 2011

Redland (http://librdf.org) - это, вероятно, решение, которое вы ищете. У него также есть привязки Python.

...