Grafo de Stack Overflow en español
Preparando el motor…
Al abrir la página se descargan Users, Posts y Tags completos desde el dump publicado en
dsevilla/bd2-data
(unos 61,3 MB comprimidos) y se construye el grafo aquí mismo: primero el esquema, después la carga. Puede tardar varios minutos y necesitar varios GB de memoria; nada sale de tu navegador.
El botón permite cambiar a la muestra reducida (unos 6,9 MB), con una pregunta de cada ocho y su hilo completo; las cifras serán menores.
Cómo se ha creado este grafo
En Neo4j se puede empezar a crear nodos sin declarar nada: el esquema es opcional y cada nodo lleva sus propiedades consigo. Aquí no. Ladybug —como Kuzu, del que procede— es una base de grafos tipada y columnar: cada clase de nodo y cada clase de relación es una tabla con columnas de tipo fijo, guardadas por columnas y recorridas de forma vectorizada. Eso es lo que le permite resolver recorridos de varios saltos deprisa sobre un WebAssembly de pocos megabytes, y el precio es declarar antes qué hay en el grafo.
Tres consecuencias que se notan al escribir consultas, y que conviene tener presentes porque en Neo4j no ocurren:
hay que crear las tablas antes de cargar nada; un nodo tiene una sola etiqueta, así que
(:Post:Question) no existe y la distinción pregunta/respuesta va en la propiedad
PostTypeId (1 pregunta, 2 respuesta); y una relación sólo une los tipos declarados en su
FROM … TO …, de modo que el propio esquema documenta qué recorridos tienen sentido.
| En los documentos | En el grafo |
|---|---|
Users | nodo (:User), identificado por Id |
Posts | nodo (:Post), con PostTypeId para distinguir pregunta de respuesta |
Tags | nodo (:Tag), identificado por TagName |
Posts.OwnerUserId | (:User)-[:WROTE]->(:Post) |
Posts.ParentId | (:Post)-[:ANSWERS]->(:Post) |
Posts.Tags («<una><otra>») | (:Post)-[:TAGGED_WITH]->(:Tag) |
Ver las sentencias que se acaban de ejecutar
Esto es literalmente lo que corre la página al cargar: primero el esquema, luego la carga masiva con COPY. Puedes copiar cualquier parte en un editor de abajo y ejecutarla. La última relación, INTERESTED_IN, empieza vacía: la llenan con MERGE los ejercicios de «Escritura y modelado», que en Neo4j no necesitarían declararla.
…