negro - Bases de datos de gráficos y triplestores RDF: almacenamiento de datos de gráficos en python
marcadores python (7)
Necesito desarrollar una base de datos de gráficos en Python (me gustaría que alguien me acompañara en el desarrollo. Ya tengo un poco de código, pero con mucho gusto lo discutiría).
Hice mi investigación en internet. en Java, neo4j es un candidato, pero no pude encontrar nada sobre el almacenamiento en disco real. En Python, hay muchos modelos de datos gráficos (consulte esta propuesta previa a PEP, pero ninguno de ellos satisface mi necesidad de almacenar y recuperar del disco).
Sin embargo, sí sé de triplestores. los triplestores son básicamente bases de datos RDF, por lo que un modelo de datos gráfico se puede mapear en RDF y almacenar, pero en general estoy incómodo (principalmente debido a la falta de experiencia) sobre esta solución. Un ejemplo es el Sesame . El hecho es que, en cualquier caso, tiene que convertir de la representación gráfica en memoria a la representación RDF y viceversa en cualquier caso, a menos que el código del cliente quiera piratear el documento RDF directamente, lo cual es muy poco probable. Sería como manejar las tuplas de DB directamente, en lugar de crear un objeto.
¿Cuál es el estado del arte para el almacenamiento y la recuperación ( a la DBMS) de datos de gráficos en Python, en este momento? ¿Tendría sentido comenzar a desarrollar una implementación, con suerte con la ayuda de alguien interesado en ella, y en colaboración con los proponentes de Graph API PEP? Tenga en cuenta que esto será parte de mi trabajo durante los próximos meses, por lo que mi contribución a este eventual proyecto es bastante grave;)
Edit : Found también fue directededge , pero parece ser un producto comercial
¡Saludos de su agente inteligente de Serius Cybernetics!
Algunos enlaces útiles ...
Con respecto a Neo4j, ¿notaste los enlaces de Python existentes? En cuanto al almacenamiento en disco, eche un vistazo a este hilo en la lista de correo .
Para graphdbs en Python, el proyecto del Sistema de gestión de base de datos Hypergraph se inició recientemente en SourceForge por Maurice Ling .
Creo que la solución realmente depende exactamente de lo que quiere hacer con el gráfico una vez que haya logrado almacenarlo en el disco / en la base de datos, y esto no está claro en su pregunta. Sin embargo, un par de cosas que podría considerar son:
- Si solo desea conservar el gráfico sin utilizar ninguna de las características o propiedades que podría esperar de una solución rdbms (como ACID), entonces, ¿qué tal si simplemente decapamos los objetos en un archivo plano? Muy rudimentario, pero como digo, depende exactamente de lo que quieras lograr.
- ZODB es una base de datos de objetos para Python (un spin off del proyecto Zope, creo). No puedo decir que haya tenido mucha experiencia en un entorno de alto rendimiento, pero con algunas restricciones, te permite almacenar objetos de Python de forma nativa.
- Si desea dedicarse a RDF, hay un proyecto de Alquimia RDF que podría ayudar a aliviar algunas de sus preocupaciones acerca de la conversión de su gráfica a estructuras RDF y creo que tiene Sésamo como parte de su pila.
Hay algunas otras herramientas de persistencia detalladas en el sitio de python que pueden ser de interés, sin embargo, pasé bastante tiempo investigando esta área el año pasado, y al final descubrí que no había una solución nativa de Python que cumpliera mis requisitos.
El mayor éxito que tuve fue usar MySQL con un ORM personalizado y publiqué un par de enlaces relevantes en respuesta a esta pregunta . Además, si desea contribuir a un proyecto RDBMS, cuando hablé con alguien de Open Query sobre un motor de almacenamiento Graph para MySQL , parecía que estaba interesado en obtener una participación activa en su proyecto.
Lo siento, no puedo dar una respuesta más definitiva, pero no creo que haya una ... Si empiezas a desarrollar tu propia implementación, me gustaría estar al tanto de cómo te encuentras.
He usado tanto Jena , que es un marco Java, como Allegrograph (Lisp, Java, enlaces Python). Jena tiene proyectos hermanos para almacenar datos de gráficos y ha existido durante mucho, mucho tiempo. Allegrograph es bastante bueno y tiene una edición gratuita. Creo que sugeriría que es fácil de instalar, gratis y rápido, y que podría estar en marcha en un momento. El poder que obtendría al aprender un poco de RDF y SPARQL bien podría valer la pena. Si ya conoces SQL, estás teniendo un gran comienzo. Ser capaz de consultar tu gráfica usando SPARQL te reportará grandes beneficios. Serialización a tripletas RDF sería fácil, y algunos de los formatos de archivo son súper fáciles (NT, por ejemplo). Voy a dar un ejemplo. Digamos que tienes los siguientes ID de nodo de borde de gráfico:
1 <- 2 -> 3 3 <- 4 -> 5
estos ya son objeto de objeto de predicado, por lo que solo tiene que darle una bofetada URI, cargarlo en el triple almacén y consultar a voluntad a través de SPARQL. Aquí está en formato 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> .
Ahora busque todos los nodos dos saltos desde el nodo 1:
SELECT ?node WHERE { <http://mycompany.com#1> ?p1 ?o1 . ?o1 ?p2 ?node . }
Por supuesto, esto produciría < http: //mycompany.com#5 >.
Otro candidato sería Mulgara , escrito en Java puro. Aunque parece que estás más interesado en Python, creo que primero deberías echar un vistazo a Allegrograph.
Hmm, tal vez deberías echarle un vistazo a CubicWeb
RDFLib es una biblioteca de python que puedes usar. Usando el ejemplo de harschware:
Crea un archivo test.nt
como abajo:
<http://mycompany.com#1> <http://mycompany.com#2> <http://mycompany.com#3> .
<http://mycompany.com#3> <http://mycompany.com#4> <http://mycompany.com#5> .
Para consultar todos los nodos dos saltos del nodo 1 en 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)
Debería devolver la respuesta <http://mycompany.com#5>
.
Redland (http://librdf.org) es probablemente la solución que está buscando. Tiene enlaces de Python también.