Índice en RedisGraph
descripción general
La indexación es un aspecto importante del diseño y desarrollo de bases de datos gráficas. La indexación puede mejorar en gran medida la eficiencia de las consultas de la base de datos.
Por ejemplo, cuando RedisGraph maneja la siguiente solicitud (consulta):
GRAPH.QUERY DEMO_GRAPH "MATCH (n:作品)-[]-(m:角色) where m.name='郭靖' return n.name"
Si no se establece un índice correspondiente, RedisGraph tendrá que atravesar los nodos cuya etiqueta es un rol y la eficiencia de la consulta es baja; si hay un índice correspondiente, RedisGraph puede encontrar directamente el nodo de destino de acuerdo con el nombre = 'Guo Jing'. evitando operaciones transversales ineficientes.
Descripción general del índice en RedisGraph
No existe una implementación de código de índice en RedisGraph, que utiliza el motor de búsqueda RediSearch para construir el índice.
RediSearch es un motor de búsqueda de texto completo de alto rendimiento que puede ejecutarse en Redis como un módulo de Redis. La estructura de datos principal de RediSearch es el índice invertido, que es una tabla hash. En otras palabras, el índice en RedisGraph es un índice hash.
Hay dos tipos de índices en RedisGraph:
-
índice de coincidencia exacta
RedisGraph solo admite la creación de índices de atributo único para nodos/bordes.
Por ejemplo, podemos crear un índice de atributo único para el atributo de nombre en el nodo cuya etiqueta es un rol:
GRAPH.QUERY DEMO_GRAPH "CREATE INDEX ON :Person(age)"
-
índice de texto completo
RedisGraph utiliza la función de índice de RediSearch para proporcionar un índice de texto completo mediante una llamada a procedimiento.
Por ejemplo, podemos construir un índice de texto completo en el atributo de nombre de todos los nodos cuya etiqueta es "rol":
GRAPH.QUERY DEMO_GRAPH "CALL db.idx.fulltext.createNodeIndex('Person', 'name')"
Implementación de índice en RedisGraph
Primero, veamos Index
la implementación. Index
Hay dos tipos, a saber, coincidencia exacta y texto completo, que admiten el establecimiento de índices de atributo único para nodo/borde. RedisGraph utiliza el motor de búsqueda RediSearch para construir un índice, que Index
está encapsulado en RedisGraph RSIndex
.
typedef struct {
char *label; // indexed label
int label_id; // indexed label ID
IndexField *fields; // indexed fields
char *language; // language
char **stopwords; // stopwords
GraphEntityType entity_type; // entity type (node/edge) indexed
IndexType type; // index type exact-match / fulltext
RSIndex *idx; // rediSearch index
} Index;
RedisGraph utiliza Schema
para organizar índices. Para cada entidad (nodo/borde), RedisGraph mantiene un archivo Schema
. Schema
Todos los índices relacionados con la entidad (nodo/borde) se almacenan en .
typedef struct {
int id; // schema id
char *name; // schema name
SchemaType type; // schema type (node/edge)
Index *index; // exact match index
Index *fulltextIdx; // full-text index
} Schema;