> **Beta Translation:** This document was translated via Machine Learning and as such may not be 100% accurate. All non-English languages are currently classified as Beta.
Esta especificação aborda problemas de desempenho na implementação da base de conhecimento Cassandra TrustGraph e propõe otimizações para o armazenamento e consulta de triplas RDF.
## Implementação Atual
### Design do Esquema
A implementação atual utiliza um design de tabela única em `trustgraph-flow/trustgraph/direct/cassandra_kg.py`:
```sql
CREATE TABLE triples (
collection text,
s text,
p text,
o text,
PRIMARY KEY (collection, s, p, o)
);
```
**Índices Secundários:**
`triples_s` EM `s` (sujeito)
`triples_p` EM `p` (predicado)
`triples_o` EM `o` (objeto)
### Padrões de Consulta
A implementação atual suporta 8 padrões de consulta distintos:
1.**get_all(coleção, limite=50)** - Recupera todas as triplas para uma coleção
```sql
SELECT s, p, o FROM triples WHERE collection = ? LIMIT 50
```
2.**get_s(collection, s, limit=10)** - Consulta por assunto
```sql
SELECT p, o FROM triples WHERE collection = ? AND s = ? LIMIT 10
```
3.**get_p(collection, p, limit=10)** - Consulta por predicado
```sql
SELECT s, o FROM triples WHERE collection = ? AND p = ? LIMIT 10
```
4.**get_o(collection, o, limit=10)** - Consulta por objeto
```sql
SELECT s, p FROM triples WHERE collection = ? AND o = ? LIMIT 10
```
5.**get_sp(collection, s, p, limit=10)** - Consulta por sujeito + predicado
```sql
SELECT o FROM triples WHERE collection = ? AND s = ? AND p = ? LIMIT 10
```
6.**get_po(collection, p, o, limit=10)** - Consulta por predicado + objeto ⚠️
```sql
SELECT s FROM triples WHERE collection = ? AND p = ? AND o = ? LIMIT 10 ALLOW FILTERING
```
7.**get_os(collection, o, s, limit=10)** - Consulta por objeto + sujeito ⚠️
```sql
SELECT p FROM triples WHERE collection = ? AND o = ? AND s = ? LIMIT 10 ALLOW FILTERING
```
8.**get_spo(collection, s, p, o, limit=10)** - Correspondência exata de tripla.
```sql
SELECT s as x FROM triples WHERE collection = ? AND s = ? AND p = ? AND o = ? LIMIT 10
Classe única `KnowledgeGraph` que gerencia todas as operações
Pool de conexões através de uma lista global `_active_clusters`
Nome de tabela fixo: `"triples"`
Modelo de keyspace por usuário
Replicação SimpleStrategy com fator 1
**Pontos de Integração:**
**Caminho de Escrita:** `trustgraph-flow/trustgraph/storage/triples/cassandra/write.py`
**Caminho de Consulta:** `trustgraph-flow/trustgraph/query/triples/cassandra/service.py`
**Armazenamento de Conhecimento:** `trustgraph-flow/trustgraph/tables/knowledge.py`
## Problemas de Desempenho Identificados
### Problemas no Nível do Schema
1.**Design de Chave Primária Ineficiente**
Atual: `PRIMARY KEY (collection, s, p, o)`
Resulta em agrupamento inadequado para padrões de acesso comuns
Força o uso de índices secundários caros
2.**Uso Excessivo de Índices Secundários** ⚠️
Três índices secundários em colunas de alta cardinalidade (s, p, o)
Índices secundários em Cassandra são caros e não escalam bem
As consultas 6 e 7 requerem `ALLOW FILTERING`, indicando modelagem de dados inadequada
3.**Risco de Partições Quentes**
Uma única chave de partição `collection` pode criar partições quentes
Grandes coleções se concentrarão em nós únicos
Não há estratégia de distribuição para balanceamento de carga
### Problemas no Nível da Consulta
1.**Uso de ALLOW FILTERING** ⚠️
Dois tipos de consulta (get_po, get_os) requerem `ALLOW FILTERING`
Essas consultas escaneiam várias partições e são extremamente caras
O desempenho degrada linearmente com o tamanho dos dados
2.**Padrões de Acesso Ineficientes**
Não há otimização para padrões de consulta RDF comuns
Índices compostos ausentes para combinações de consulta frequentes
Não há consideração para padrões de travessia de grafos
3.**Falta de Otimização de Consulta**
Não há cache de prepared statements
Não há dicas de consulta ou estratégias de otimização
Não há consideração para paginação além de um simples LIMIT
## Declaração do Problema
A implementação atual da base de conhecimento Cassandra tem dois gargalos críticos de desempenho:
### 1. Desempenho Ineficiente da Consulta get_po
A consulta `get_po(collection, p, o)` é extremamente ineficiente devido à necessidade de `ALLOW FILTERING`:
```sql
SELECT s FROM triples WHERE collection = ? AND p = ? AND o = ? LIMIT 10 ALLOW FILTERING
```
**Por que isso é problemático:**
`ALLOW FILTERING` força o Cassandra a escanear todas as partições dentro da coleção.
O desempenho diminui linearmente com o tamanho dos dados.
Este é um padrão de consulta RDF comum (encontrar sujeitos que têm um relacionamento específico de predicado-objeto).
Cria uma carga significativa no cluster à medida que os dados crescem.
### 2. Estratégia de Clustering Inadequada
A chave primária atual `PRIMARY KEY (collection, s, p, o)` oferece benefícios mínimos de clustering:
**Problemas com o clustering atual:**
`collection` como chave de partição não distribui os dados de forma eficaz.
A maioria das coleções contém dados diversos, tornando o clustering ineficaz.
Não há consideração para padrões de acesso comuns em consultas RDF.
Coleções grandes criam partições quentes em nós únicos.
As colunas de clustering (s, p, o) não otimizam para padrões típicos de travessia de grafos.
**Impacto:**
As consultas não se beneficiam da localidade dos dados.
Utilização inadequada do cache.
Distribuição desigual de carga entre os nós do cluster.
Gargalos de escalabilidade à medida que as coleções crescem.
## Solução Proposta: Estratégia de Desnormalização de 4 Tabelas
### Visão Geral
Substitua a única tabela `triples` por quatro tabelas projetadas especificamente, cada uma otimizada para padrões de consulta específicos. Isso elimina a necessidade de índices secundários e ALLOW FILTERING, ao mesmo tempo em que fornece desempenho ideal para todos os tipos de consulta. A quarta tabela permite a exclusão eficiente de coleções, apesar das chaves de partição compostas.
### Novo Design de Esquema
**Tabela 1: Consultas Centradas no Sujeito (triples_s)**
```sql
CREATE TABLE triples_s (
collection text,
s text,
p text,
o text,
PRIMARY KEY ((collection, s), p, o)
);
```
**Otimiza:** get_s, get_sp, get_os
**Chave de Partição:** (coleção, s) - Melhor distribuição do que apenas a coleção
**Agrupamento:** (p, o) - Permite pesquisas eficientes de predicados/objetos para um sujeito
# Verify no performance degradation in integration
```
### Plano de Reversão
#### Estratégia de Reversão Rápida
1.**Alternância de variáveis de ambiente** - Retorne imediatamente para as tabelas legadas.
2.**Mantenha as tabelas legadas** - Não as exclua até que o desempenho seja comprovado.
3.**Alertas de monitoramento** - Disparos de reversão automatizados com base em taxas de erro/latência.
#### Validação da Reversão
```python
def rollback_to_legacy():
# Set environment variable
os.environ['CASSANDRA_USE_LEGACY'] = 'true'
# Restart services to pick up change
restart_cassandra_services()
# Validate functionality
run_smoke_tests()
```
## Riscos e Considerações
### Riscos de Desempenho
**Aumento da latência de escrita** - 4 operações de escrita por inserção (33% a mais do que a abordagem de 3 tabelas)
**Sobrecarga de armazenamento** - 4x o requisito de armazenamento (33% a mais do que a abordagem de 3 tabelas)
**Falhas de escrita em lote** - Necessidade de tratamento adequado de erros
**Complexidade da exclusão** - A exclusão da coleção requer um loop de leitura e exclusão
### Riscos Operacionais
**Complexidade da migração** - Migração de dados para grandes conjuntos de dados
**Desafios de consistência** - Garantir que todas as tabelas permaneçam sincronizadas
**Lacunas de monitoramento** - Necessidade de novas métricas para operações de várias tabelas
### Estratégias de Mitigação
1.**Implantação gradual** - Começar com pequenas coleções
2.**Monitoramento abrangente** - Rastrear todas as métricas de desempenho
3.**Validação automatizada** - Verificação contínua de consistência
4.**Capacidade de reversão rápida** - Seleção de tabela baseada no ambiente
## Critérios de Sucesso
### Melhorias de Desempenho
[ ] **Eliminar ALLOW FILTERING** - as consultas get_po e get_os são executadas sem filtragem
[ ] **Redução da latência da consulta** - melhoria de 50% ou mais nos tempos de resposta da consulta
[ ] **Melhor distribuição de carga** - Sem partições quentes, distribuição uniforme entre os nós do cluster
[ ] **Desempenho escalável** - Tempo de consulta proporcional ao tamanho do resultado, não ao volume total de dados
### Requisitos Funcionais
[ ] **Compatibilidade da API** - Todo o código existente continua a funcionar sem alterações
[ ] **Consistência de dados** - As três tabelas permanecem sincronizadas
[ ] **Nenhuma perda de dados** - A migração preserva todas as triplas existentes
[ ] **Compatibilidade com versões anteriores** - Capacidade de reverter para o esquema legado
### Requisitos Operacionais
[ ] **Migração segura** - Implantação blue-green com capacidade de reversão
[ ] **Cobertura de monitoramento** - Métricas abrangentes para operações de várias tabelas
[ ] **Cobertura de teste** - Todos os padrões de consulta testados com benchmarks de desempenho
[ ] **Documentação** - Procedimentos de implantação e operação atualizados
## Cronograma
### Fase 1: Implementação
[ ] Reescrever `cassandra_kg.py` com o esquema de várias tabelas
[ ] Implementar operações de escrita em lote
[ ] Adicionar otimização de declaração preparada
[ ] Atualizar testes unitários
### Fase 2: Testes de Integração
[ ] Atualizar testes de integração
[ ] Benchmarking de desempenho
[ ] Teste de carga com volumes de dados realistas
[ ] Scripts de validação para consistência de dados
### Fase 3: Planejamento da Migração
[ ] Scripts de implantação blue-green
[ ] Ferramentas de migração de dados
[ ] Atualizações do painel de monitoramento
[ ] Procedimentos de reversão
### Fase 4: Implantação em Produção
[ ] Implantação gradual em produção
[ ] Monitoramento e validação de desempenho
[ ] Limpeza de tabelas legadas
[ ] Atualizações de documentação
## Conclusão
Esta estratégia de desnormalização multi-tabela aborda diretamente os dois gargalos de desempenho críticos:
1.**Elimina o ALLOW FILTERING caro** fornecendo estruturas de tabela ideais para cada padrão de consulta
2.**Melhora a eficácia do agrupamento** por meio de chaves de partição compostas que distribuem a carga adequadamente
A abordagem aproveita os pontos fortes do Cassandra, mantendo a compatibilidade total da API, garantindo que o código existente se beneficie automaticamente das melhorias de desempenho.