Базы данных графов и хранилища троек RDF: хранение данных графов в Python

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

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

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

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

Изменить: также найдено directededge, но похоже, что это коммерческий продукт.


person Stefano Borini    schedule 19.08.2009    source источник


Ответы (7)


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

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 .
}

Это, конечно, даст ‹http://mycompany.com#5>.

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

person harschware    schedule 02.01.2010
comment
Я действительно рассматриваю Аллегро. - person Stefano Borini; 23.02.2010
comment
Могу ли я легко применить некоторый анализ графов с помощью RDF, а также SPARQL? например, расстояние между двумя узлами, кратчайший путь, обход? - person rnd_nr_gen; 03.09.2010
comment
Не то, чтобы я в курсе ... Кстати, этот вопрос - хороший кандидат для semanticoverflow.com - person harschware; 03.09.2010

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

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

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

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

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

person Mark Streatfield    schedule 20.08.2009

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

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

person Laserblue    schedule 13.02.2011

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

person Community    schedule 20.08.2009

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

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

person nawroth    schedule 03.09.2009

Redland (http://librdf.org), вероятно, именно то решение, которое вы ищете. Он также имеет привязки к Python.

person Slava Kravchenko    schedule 17.07.2011

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>.

person Resu    schedule 16.07.2018