mirror of
https://github.com/trustgraph-ai/trustgraph.git
synced 2026-04-25 08:26:21 +02:00
Native CLI i18n: The TrustGraph CLI has built-in translation support that dynamically loads language strings. You can test and use different languages by simply passing the --lang flag (e.g., --lang es for Spanish, --lang ru for Russian) or by configuring your environment's LANG variable. Automated Docs Translations: This PR introduces autonomously translated Markdown documentation into several target languages, including Spanish, Swahili, Portuguese, Turkish, Hindi, Hebrew, Arabic, Simplified Chinese, and Russian.
394 lines
16 KiB
Markdown
394 lines
16 KiB
Markdown
---
|
|
layout: default
|
|
title: "Especificación Técnica de Contextos de Grafos"
|
|
parent: "Spanish (Beta)"
|
|
---
|
|
|
|
# Especificación Técnica de Contextos de Grafos
|
|
|
|
> **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.
|
|
|
|
## Resumen
|
|
|
|
Esta especificación describe los cambios en los primitivos de grafos centrales de TrustGraph para
|
|
alinearse con RDF 1.2 y admitir la semántica completa del conjunto de datos RDF. Este es un
|
|
cambio importante para la serie de versiones 2.x.
|
|
|
|
### Versionamiento
|
|
|
|
- **2.0**: Lanzamiento para adoptantes tempranos. Características principales disponibles,
|
|
puede que no esté completamente lista para producción.
|
|
- **2.1 / 2.2**: Lanzamiento de producción. Estabilidad y completitud validadas.
|
|
|
|
La flexibilidad en cuanto a la madurez es intencional: los adoptantes tempranos pueden acceder a nuevas
|
|
capacidades antes de que todas las funciones estén listas para producción.
|
|
|
|
## Objetivos
|
|
|
|
Los objetivos principales de este trabajo son habilitar metadatos sobre hechos/afirmaciones:
|
|
|
|
- **Información temporal**: Asociar hechos con metadatos de tiempo
|
|
- Cuándo se creyó que un hecho era verdadero
|
|
- Cuándo un hecho se volvió verdadero
|
|
- Cuándo se descubrió que un hecho era falso
|
|
|
|
- **Origen/Fuentes**: Realizar un seguimiento de las fuentes que respaldan un hecho
|
|
- "Este hecho fue respaldado por la fuente X"
|
|
- Enlazar los hechos con sus documentos de origen
|
|
|
|
- **Veracidad/Confianza**: Registrar afirmaciones sobre la verdad
|
|
- "La persona P afirmó que esto era cierto"
|
|
- "La persona Q afirma que esto es falso"
|
|
- Habilitar la puntuación de confianza y la detección de conflictos
|
|
|
|
**Hipótesis**: La reificación (RDF-star / triples con comillas) es el mecanismo clave
|
|
para lograr estos resultados, ya que todos requieren hacer afirmaciones sobre afirmaciones.
|
|
|
|
## Antecedentes
|
|
|
|
Para expresar "el hecho (Alice conoce a Bob) se descubrió el 2024-01-15" o
|
|
"la fuente X respalda la afirmación (Y causa Z)", necesita referenciar un borde
|
|
como algo sobre lo cual se pueden hacer afirmaciones. Los triples estándar no admiten esto.
|
|
|
|
### Limitaciones actuales
|
|
|
|
La clase `Value` actual en `trustgraph-base/trustgraph/schema/core/primitives.py`
|
|
puede representar:
|
|
- Nodos URI (`is_uri=True`)
|
|
- Valores literales (`is_uri=False`)
|
|
|
|
El campo `type` existe, pero no se utiliza para representar los tipos de datos XSD.
|
|
|
|
## Diseño técnico
|
|
|
|
### Características de RDF a admitir
|
|
|
|
#### Características principales (relacionadas con los objetivos de reificación)
|
|
|
|
Estas características están directamente relacionadas con los objetivos temporales, de origen y de veracidad:
|
|
|
|
1. **RDF 1.2 Triples con comillas (RDF-star)**
|
|
- Bordes que apuntan a otros bordes
|
|
- Un triple puede aparecer como sujeto u objeto de otro triple
|
|
- Permite hacer afirmaciones sobre afirmaciones (reificación)
|
|
- Mecanismo central para anotar hechos individuales
|
|
|
|
2. **Conjunto de datos RDF / Grafos con nombre**
|
|
- Soporte para múltiples grafos con nombre dentro de un conjunto de datos
|
|
- Cada grafo identificado por un IRI
|
|
- Pasa de triples (s, p, o) a cuads (s, p, o, g)
|
|
- Incluye un grafo predeterminado más cero o más grafos con nombre
|
|
- El IRI del grafo puede ser un sujeto en las afirmaciones, por ejemplo:
|
|
```
|
|
<graph-source-A> <discoveredOn> "2024-01-15"
|
|
<graph-source-A> <hasVeracity> "high"
|
|
```
|
|
- Nota: Los grafos con nombre son una característica separada de la reificación. Tienen
|
|
usos más allá de la anotación de afirmaciones (particionamiento, control de acceso, organización del conjunto de datos)
|
|
y deben tratarse como una capacidad distinta.
|
|
|
|
3. **Nodos vacíos** (Soporte limitado)
|
|
- Nodos anónimos sin un URI global
|
|
- Compatible al cargar datos RDF externos
|
|
- **Estado limitado**: No hay garantías sobre la identidad estable después de la carga
|
|
- Encontrarlos a través de consultas comodín (coincidencia por conexiones, no por ID)
|
|
- No es una característica de primera clase: no confíe en el manejo preciso de nodos vacíos.
|
|
|
|
#### Correcciones oportunistas (cambio importante de la versión 2.0)
|
|
|
|
Estas características no están directamente relacionadas con los objetivos de la reificación, pero son
|
|
mejoras valiosas a incluir al realizar cambios importantes:
|
|
|
|
4. **Tipos de literales**
|
|
- Utilice correctamente el campo `type` para los tipos de datos XSD
|
|
- Ejemplos: xsd:string, xsd:integer, xsd:dateTime, etc.
|
|
- Corrige la limitación actual: no se pueden representar fechas o enteros correctamente.
|
|
|
|
5. **Etiquetas de idioma**
|
|
- Soporte para atributos de idioma en literales (por ejemplo, @en, @fr)
|
|
- Nota: un literal tiene una etiqueta de idioma O un tipo de datos, no ambos
|
|
(excepto para rdf:langString)
|
|
- Importante para casos de uso de IA/multilingües.
|
|
|
|
### Modelos de datos
|
|
|
|
#### Término (cambiar de Value)
|
|
|
|
La clase `Value` se renombrará a `Term` para reflejar mejor la terminología de RDF.
|
|
Este cambio de nombre tiene dos propósitos:
|
|
1. Alinea la nomenclatura con los conceptos de RDF (un "Término" puede ser un IRI, literal, nodo vacío o triple con comillas,
|
|
no solo un "valor")
|
|
2. Fuerza la revisión del código en la interfaz de cambio importante: cualquier código que aún haga referencia a `Value`
|
|
se considera roto y debe actualizarse.
|
|
|
|
Un Término puede representar:
|
|
|
|
- **IRI/URI**: un nodo/recurso con nombre
|
|
- **Nodo vacío**: un nodo anónimo con alcance local
|
|
- **Literal**: un valor de datos con:
|
|
- Un tipo de datos (tipo XSD), O
|
|
- Una etiqueta de idioma
|
|
- **Triple con comillas**: un triple utilizado como término (RDF 1.2)
|
|
|
|
##### Enfoque elegido: Clase única con discriminador de tipo
|
|
|
|
Los requisitos de serialización impulsan la estructura: se necesita un discriminador de tipo en el formato de cable
|
|
independientemente de la representación de Python. Una clase única con un campo de tipo es la opción natural y se alinea con la
|
|
patrón `Value` actual.
|
|
|
|
Los códigos de tipo de un solo carácter proporcionan una serialización compacta:
|
|
|
|
```python
|
|
from dataclasses import dataclass
|
|
|
|
# Constantes de tipo de término
|
|
IRI = "i" # Nodo IRI/URI
|
|
BLANK = "b" # Nodo vacío
|
|
LITERAL = "l" # Valor literal
|
|
TRIPLE = "t" # Triple con comillas (RDF 1.2)
|
|
|
|
@dataclass
|
|
class Term:
|
|
type: str = "" # Uno de: IRI, BLANK, LITERAL, TRIPLE
|
|
|
|
# Para términos IRI (type == IRI)
|
|
iri: str = ""
|
|
|
|
# Para nodos vacíos (type == BLANK)
|
|
id: str = ""
|
|
|
|
# Para literales (type == LITERAL)
|
|
value: str = ""
|
|
datatype: str = "" # URI de tipo de datos XSD (mutuamente excluyente con el idioma)
|
|
language: str = "" # Etiqueta de idioma (mutuamente excluyente con el tipo de datos)
|
|
|
|
# Para triples con comillas (type == TRIPLE)
|
|
triple: "Triple | None" = None
|
|
```
|
|
|
|
Ejemplos de uso:
|
|
|
|
```python
|
|
# Término IRI
|
|
node = Term(type=IRI, iri="http://example.org/Alice")
|
|
|
|
# Literal con tipo de datos
|
|
age = Term(type=LITERAL, value="42", datatype="xsd:integer")
|
|
|
|
# Literal con etiqueta de idioma
|
|
label = Term(type=LITERAL, value="Hello", language="en")
|
|
|
|
# Nodo vacío
|
|
anon = Term(type=BLANK, id="_:b1")
|
|
|
|
# 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ón numé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.
|
|
|
|
## Referencias
|
|
|
|
- [Conceptos RDF 1.2](https://www.w3.org/TR/rdf12-concepts/)
|
|
- [RDF-star y SPARQL-star](https://w3c.github.io/rdf-star/)
|
|
- [Conjunto de datos RDF](https://www.w3.org/TR/rdf11-concepts/#section-dataset)
|