Index in RedisGraph
Überblick
Die Indizierung ist ein wichtiger Aspekt des Entwurfs und der Entwicklung von Graphdatenbanken. Indizes können die Abfrageeffizienz der Datenbank erheblich verbessern.
Wenn RedisGraph beispielsweise die folgende Anfrage (Abfrage) verarbeitet:
GRAPH.QUERY DEMO_GRAPH "MATCH (n:作品)-[]-(m:角色) where m.name='郭靖' return n.name"
Wenn kein entsprechender Index eingerichtet ist, muss RedisGraph die Knoten durchlaufen, deren Bezeichnung eine Rolle ist, und die Abfrageeffizienz ist gering. Wenn ein entsprechender Index vorhanden ist, kann RedisGraph den Zielknoten direkt anhand von name='Guo Jing' finden. Vermeidung ineffizienter Traversierungsvorgänge.
Übersicht über den Index in RedisGraph
Es gibt keine Indexcode-Implementierung in RedisGraph, das die RediSearch-Suchmaschine zum Erstellen des Index verwendet.
RediSearch ist eine leistungsstarke Volltextsuchmaschine, die als Redis-Modul auf Redis ausgeführt werden kann. Die Kerndatenstruktur von RediSearch ist der invertierte Index, der hashbar ist. Mit anderen Worten, der Index in RedisGraph ist ein Hash-Index.
Es gibt zwei Arten von Indizes in RedisGraph:
-
exakter Übereinstimmungsindex
RedisGraph unterstützt nur die Erstellung von Einzelattributindizes für Knoten/Kanten.
Beispielsweise können wir einen Einzelattributindex für das Namensattribut auf dem Knoten erstellen, dessen Bezeichnung eine Rolle ist:
GRAPH.QUERY DEMO_GRAPH "CREATE INDEX ON :Person(age)"
-
Volltextindex
RedisGraph nutzt die Indexfunktion von RediSearch, um über einen Prozeduraufruf einen Volltextindex bereitzustellen.
Beispielsweise können wir einen Volltextindex für das Namensattribut aller Knoten erstellen, deren Bezeichnung „Rolle“ ist:
GRAPH.QUERY DEMO_GRAPH "CALL db.idx.fulltext.createNodeIndex('Person', 'name')"
Implementierung des Index in RedisGraph
Schauen wir uns zunächst Index
die Implementierung an. Index
Es gibt zwei Typen, nämlich Exact-Match und Fulltext, die die Einrichtung von Einzelattributindizes für Knoten/Kanten unterstützen. RedisGraph verwendet die RediSearch-Suchmaschine, um einen Index zu erstellen, der Index
in RedisGraph gekapselt ist 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 wird Schema
zum Organisieren von Indizes verwendet. Für jede Entität (Knoten/Kante) verwaltet RedisGraph eine Schema
. Schema
Alle mit der Entität (Knoten/Kante) verbundenen Indizes werden in gespeichert.
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;