Closed ExarcaFidalgo closed 4 years ago
La idea que he tenido para solucionar esto es generar una subclase que contenga los atributos de cada conjunto. La clase original presenta una referencia a dicha subclase con la cardinalidad del conjunto. Admite x niveles.
He probado el siguiente ejemplo en la transformación Shex-XMI:
prefix : https://schema.org/ prefix xsd: http://www.w3.org/2001/XMLSchema# base http://example.org/
:User { :name xsd:string ; ( :givenName xsd:string ; :familyName xsd:string ) ?; ( :b :something ; :c xsd:string ) *; :owns @:Garage; }
:Garage { (AE86 xsd:string; ( Levin xsd:string; Cilinders xsd:int ) ?; ( Trueno xsd:string; Cilinders xsd:int ) ?; ) +
}
Y funciona correctamente.
Si realizamos la operación de vuelta, genera lo siguiente:
prefix : https://schema.org/ prefix xsd: http://www.w3.org/2001/XMLSchema# base http://example.org/
:User { :name xsd:string; :User_1 @:User_1 ?; :User_2 @:User_2 *; :owns @:Garage; }
:User_1 { :givenName xsd:string; :familyName xsd:string; }
:User_2 { :b :something; :c xsd:string; }
:Garage { :Garage_1 @:Garage_1 +; }
:Garage_1 { AE86 xsd:string; :Garage_1_1 @:Garage_1_1 ?; :Garage_1_2 @:Garage_1_2 ?; }
:Garage_1_1 { Levin xsd:string; Cilinders xsd:int; }
:Garage_1_2 { Trueno xsd:string; Cilinders xsd:int; }
Una muestra más de lo correcto de nuestras asociaciones. Creo que es interesante guardarlo para el futuro. Idealmente reconoceríamos estas subclases para generar los conjuntos. (Ya adelanto que va a ser una operación compleja). Pero por ahora, genera algo correcto, así que es aceptable.
Funciona en sendas direcciones.
Se puede aplicar cardinalidades a un conjunto de propiedades.
:User { schema:name xsd:string ; ( schema:givenName xsd:string ; schema:familyName xsd:string ) ? }
Por ejemplo, en el caso anterior User puede contener ambas propiedades, o ninguna.