2011-05-11 10 views
15

Tengo una aplicación que almacena información de relaciones en una tabla MySQL (contact_id, other_contact_id, strength, recorded_at). Esto está bien si todo lo que necesito hacer es mostrar quiénes son las relaciones de un contacto o incluso generar una lista de contactos mutuos para dos contactos.Almacenamiento de múltiples gráficos en Neo4J

Pero ahora necesito generar estadísticas como: '¿Cuál fue el número total de conexiones bidireccionales de fuerza 3 o superior en enero de 2011' o (suponiendo que cada contacto es parte de un grupo) 'qué grupo tiene la la mayoría de las conexiones a otros grupos, etc.

Descubrí rápidamente que el SQL para generar estas estadísticas se volvía muy rápido.

Así que escribí un script que para cualquier fecha determinada generará un gráfico en la memoria. Entonces podría ejecutar cualquier estadística que quisiera contra ese gráfico. Mucho más fácil de entender y, en general, mucho más eficiente también, excepto en la generación de la parte gráfica.

Mi siguiente pensamiento fue almacenar esos gráficos en caché para poder invocarlos cada vez que necesitaba ejecutar una nueva estadística (o generar un gráfico posterior; por ejemplo, para el gráfico de hoy tomo el gráfico de ayer y aplico los cambios que ocurrieron ayer) . Probé Memcached, que funcionó muy bien hasta que los gráficos crecieron> 1 MB.

Así que ahora estoy pensando en usar una base de datos de gráficos como Neo4J.

El único problema es que no tengo un solo gráfico. O lo hago, pero es uno que cambia con el tiempo y necesito poder consultarlo con diferentes tiempos de referencia.

Por lo tanto, puedo:

  • almacenar múltiples gráficos en Neo4J y rertrieve/interactuar con ellos por separado? Entonces crearía y almacenaría gráficos sociales separados para cada fecha.

o

  • añadir válida desde y hacia las marcas de tiempo a cada borde y el filtro de la gráfica adecuada: así que si quería un gráfico para "1er puede" yo sólo seguir el borde más reciente entre dos noeds que se creó antes del "1 de mayo" (y si todos los bordes se crearon después del 1 de mayo, entonces esos nodos no se conectarían).

Soy bastante nuevo en las bases de datos de gráficos por lo que cualquier ayuda/indicaciones/sugerencias serán apreciadas.

+1

después de hacer algunas lecturas me pregunto si los nodos de referencia son la clave? Podría crear un nodo de referencia para cada día y luego construir el gráfico de ese día fuera de su nodo de referencia ... – emh

+0

Hola, creo que usar nodos externos para los gráficos, y tal vez indexarlos con alguna propiedad para que pueda encontrarlos no solo un nodo de referencia pero por búsqueda de índice puede ayudar aquí. ¿La indexación de ciertas propiedades de "metadatos" de los nodos de entrada de su subgráfico le daría los puntos de partida correctos? –

Respuesta

14

Ahora mismo puede almacenar una sola base de datos de gráficos en una sola instancia de Neo4j, pero esta única graphdb puede contener tantos subgráficos diferentes como desee. Solo debe tener eso en cuenta al realizar operaciones globales (como las consultas de índice), pero allí puede realizar consultas compuestas que también incluyan propiedades con marcas de tiempo para limitar los resultados.

Una forma de hacerlo es, como dijiste al agregar información temporal a los bordes para representar la estructura de un gráfico para una fecha determinada, puedes recorrer la estructura del gráfico en ese momento.

El nodo de referencia tiene un significado diferente en Neo4j.

Usar nodos de categoría por día (y vincularlos y también agregarlos para intervalos de tiempo de mayor nivel) es la manera más gráfica de categorizar los nodos que las propiedades indexadas. (Efectivamente, estos son índices en gráficos que puede incluir fácilmente en sus cruces y consultas de gráficos).

No tiene que duplicar los nodos siempre que solo esté interesado en estructuras temporales diferentes. Si sus nodos también son diferentes (por ejemplo, cambiar propiedades, puede duplicarlos y crear subgrafos de manera efectiva) o crear una lista conectada de nodos de historial en cada nodo que contenga solo los cambios (o la instantánea completa según sus requisitos) .

Su dominio suena muy apropiado para la base de datos de gráficos. Si tiene más preguntas detalladas, no dude en unirse a la Neo4j mailing list.

+0

El enlace de la lista de distribución está muerto – keyser

5

No es la solución más fácil (supongo que solo trabaja con una máquina), pero si realmente desea separar sus gráficos, solo necesita recordar que un gráfico es un directorio.

Puede crear una clase de cargador dinámico que tome la ruta de la base de datos que desea, cargarla en la memoria de la consulta y cerrarla después de obtener su respuesta. También puede configurar un servidor proxy y enviar 2 parámetros a su cargador: su consulta (que supongo que es una consulta de cifrado en este caso) y la ruta de la base de datos que desea consultar.

Esto no es adecuado si tiene toneladas de consultas en tiempo real para responder. Pero si se trata simplemente de almacenar y analizar algunos conjuntos de datos, definitivamente puede responder a sus necesidades.

+2

¿Puede arrojar algo de luz sobre cómo referir dinámicamente la ruta de la base de datos de gráficos en la consulta de cifrado. Gracias por adelantado... –

Cuestiones relacionadas