> **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.
# Triple con comillas (afirmación sobre una afirmación)
inner = Triple(
s=Term(type=IRI, iri="http://example.org/Alice"),
p=Term(type=IRI, iri="http://example.org/knows"),
o=Term(type=IRI, iri="http://example.org/Bob"),
)
reified = Term(type=TRIPLE, triple=inner)
```
##### Alternativas consideradas
**Opción B: Unión de clases especializadas** (`Term = IRI | BlankNode | Literal | QuotedTriple`)
- Rechazada: La serialización aún necesitaría un discriminador de tipo, lo que agregaría complejidad.
**Opción C: Clase base con subclases**
- Rechazada: El mismo problema de serialización, además de peculiaridades de la herencia de dataclass.
#### Triple / Cuad
La clase `Triple` gana un campo de grafo opcional para convertirse en un cuad:
```python
@dataclass
class Triple:
s: Term | None = None # Sujeto
p: Term | None = None # Predicado
o: Term | None = None # Objeto
g: str | None = None # Nombre del grafo (IRI), None = grafo predeterminado
```
Decisiones de diseño:
- **Nombre del campo**: `g` para la coherencia con `s`, `p`, `o`
- **Opcional**: `None` significa el grafo predeterminado (sin nombre)
- **Tipo**: Cadena simple (IRI) en lugar de Term
- Los nombres de los grafos siempre son IRIs
- Los nodos vacíos como nombres de grafos se descartaron (demasiado confusos)
- No es necesario el conjunto completo de mecanismos de Term
Nota: El nombre de la clase permanece `Triple` incluso si técnicamente es un cuad ahora.
Esto evita la alteración y la terminología "triple" todavía es la terminología común. El contexto del grafo es
metadatos sobre dónde vive el triple.
### Patrones de consulta candidatos
El motor de consulta actual acepta combinaciones de términos S, P, O. Con los triples con comillas,
un triple en sí mismo se convierte en un término válido en esas posiciones. A continuación, se presentan patrones de consulta
candidatos que admiten los objetivos originales.
#### Semántica de parámetros de grafo
Siguiendo las convenciones de SPARQL para la compatibilidad hacia atrás:
- **`g` omitido / None**: Consulta solo el grafo predeterminado
- **`g` = IRI específico**: Consulta solo ese grafo con nombre
- **`g` = comodín / `*`**: Consulta en todos los grafos (equivalente a `GRAPH ?g { ... }` de SPARQL)
Esto mantiene las consultas simples simples y hace que las consultas de grafos con nombre sean opcionales.
Las consultas entre grafos (g=comodín) se admiten completamente. El esquema de Cassandra incluye tablas dedicadas (SPOG, POSG, OSPG)
donde g es una columna de agrupación, en lugar de una clave de partición, lo que permite consultas eficientes en todos los grafos.
#### Consultas temporales
**Encontrar todos los hechos descubiertos después de una fecha determinada:**
```
S: ? # cualquier triple con comillas
P: <discoveredOn>
O: > "2024-01-15"^^xsd:date # comparación de fecha
```
**Encontrar cuándo se creyó que un hecho era verdadero:**
```
S: <<<Alice><knows><Bob> >> # triple con comillas como sujeto
P: <believedTrueFrom>
O: ? # devuelve la fecha
```
**Encontrar los hechos que se descubrió que eran falsos:**
```
S: ? # cualquier triple con comillas
P: <discoveredFalseOn>
O: ? # tiene cualquier valor (existe)
```
#### Consultas de origen
**Encontrar todos los hechos respaldados por una fuente específica:**
```
S: ? # cualquier triple con comillas
P: <supportedBy>
O: <source:document-123>
```
**Encontrar qué fuentes respaldan un hecho específico:**
```
S: <<<DrugA><treats><DiseaseB> >> # triple con comillas como sujeto
P: <supportedBy>
O: ? # devuelve las IRIs de la fuente
```
#### Consultas de veracidad
**Encontrar las afirmaciones que una persona marcó como verdaderas:**
```
S: ? # cualquier triple con comillas
P: <assertedTrueBy>
O: <person:Alice>
```
**Encontrar las afirmaciones conflictivas (el mismo hecho, diferente veracidad):**
```
# Primera consulta: hechos afirmados como verdaderos
S: ?
P: <assertedTrueBy>
O: ?
# Segunda consulta: hechos afirmados como falsos
S: ?
P: <assertedFalseBy>
O: ?
# Lógica de la aplicación: encontrar la intersección de los sujetos
```
**Encontrar los hechos con una puntuación de confianza por debajo del umbral:**
```
S: ? # cualquier triple con comillas
P: <trustScore>
O: <0.5#comparaciónnumérica
```
### Arquitectura
Se requieren cambios significativos en varios componentes:
#### Este repositorio (trustgraph)
- **Primitivos del esquema** (`trustgraph-base/trustgraph/schema/core/primitives.py`)
-`Value` → `Term` cambio de nombre
- Nueva estructura de `Term` con discriminador de tipo
-`Triple` gana el campo `g` para el contexto del grafo
- **Traductores de mensajes** (`trustgraph-base/trustgraph/messaging/translators/`)
- Actualizaciones para las nuevas estructuras de `Term` y `Triple`
- **Componentes de puerta de enlace**
- Manejar nuevas estructuras de `Term` y cuádruple
- **Núcleos de conocimiento**
- ...
- **Pruebas**
- ...
Esto se deja para futuras implementaciones.
- **Vector store boundary**
- ...
Esto se deja para futuras implementaciones.
## Consideraciones de seguridad
Los grafos con nombre no son una característica de seguridad. Los usuarios y las colecciones siguen siendo los límites de seguridad.
Los grafos con nombre son puramente para la organización de datos y el soporte de la reificación.
## Consideraciones de rendimiento
- Los triples con comillas agregan profundidad de anidamiento; esto puede afectar el rendimiento de las consultas.
- Se necesitan estrategias de indexación para consultas con ámbito de grafo.
- El diseño del esquema de Cassandra deberá acomodar el almacenamiento de cuádruples de forma eficiente.
### Límite del almacén vectorial
Los almacenes vectoriales siempre hacen referencia a IRIs:
- Nunca bordes (triples con comillas)
- Nunca valores literales
- Nunca nodos vacíos
Esto mantiene el almacén vectorial simple; se encarga de la similitud semántica de las entidades con nombre. La estructura del grafo maneja las relaciones, la reificación y los metadatos. Los triples con comillas y los grafos con nombre no complican las operaciones vectoriales.
## Estrategia de pruebas
Utilice la estrategia de prueba existente. Dado que esta es una versión importante, se prestará especial atención al
conjunto de pruebas de extremo a extremo para validar que las nuevas estructuras funcionan correctamente en todos los componentes.
## Plan de migración
- La versión 2.0 es una versión importante; no se requiere compatibilidad con versiones anteriores
- Los datos existentes pueden necesitar migrarse al nuevo esquema (por determinarse según el diseño final)
- Considere herramientas de migración para convertir triples existentes
## Preguntas abiertas
- **Nodos vacíos**: Soporte limitado confirmado. Es posible que deba decidirse sobre una estrategia de skolemización (generar IRIs
al cargar o preservar los ID de nodos vacíos).
- **Sintaxis de consulta**: ¿Cuál es la sintaxis concreta para especificar triples con comillas en las consultas? Debe definirse
la API de consulta.
- ~~**Vocabulario de predicados**~~: Resuelto. Se permiten todos los predicados RDF válidos, incluidos los personalizados definidos por el usuario.
Supuestos mínimos sobre la validez de RDF. Muy pocos valores bloqueados (por ejemplo, `rdfs:label` se utiliza en algunos lugares).
Estrategia: evite bloquear cualquier cosa a menos que sea absolutamente necesario.
- ~~**Impacto del almacén vectorial**~~: Resuelto. Los almacenes vectoriales siempre apuntan a IRIs.
solo; nunca bordes, literales o nodos vacíos. Los triples con comillas y la reificación no afectan al almacén vectorial.
- ~~**Semántica del grafo con nombre**~~: Resuelta. Las consultas predeterminadas son para el grafo predeterminado (coincide con el comportamiento de SPARQL,
compatible con versiones anteriores). Se requiere un parámetro de grafo explícito para consultar grafos con nombre o todos los grafos.