# Type Mapping Reference
Complete reference for RDF type mappings to all supported languages.
## Quick Reference Table
| `xsd:string` | `String` | `string` | `str` | `string` | `String` |
| `xsd:integer` | `i32` | `number` | `int` | `int` | `int` |
| `xsd:long` | `i64` | `number` | `int` | `int64` | `long` |
| `xsd:decimal` | `f64` | `number` | `Decimal` | `float64` | `BigDecimal` |
| `xsd:float` | `f32` | `number` | `float` | `float32` | `float` |
| `xsd:boolean` | `bool` | `boolean` | `bool` | `bool` | `boolean` |
| `xsd:date` | `chrono::NaiveDate` | `Date` | `date` | `time.Time` | `LocalDate` |
| `xsd:dateTime` | `chrono::DateTime` | `Date` | `datetime` | `time.Time` | `LocalDateTime` |
| `xsd:duration` | `chrono::Duration` | `Duration` | `timedelta` | `time.Duration` | `Duration` |
| `xsd:anyURI` | `String` | `string` | `str` | `string` | `URI` |
| `xsd:base64Binary` | `Vec<u8>` | `Uint8Array` | `bytes` | `[]byte` | `byte[]` |
| `rdfs:Class` | `pub struct` | `interface` | `class` | `type` | `class` |
| `rdf:Property` (datatype) | `pub field` | `property` | `attribute` | `field` | `field` |
| `rdf:Property` (object) | `fn get_*()` | `get*()` | `def get_*()` | `Get*()` | `get*()` |
## Semantic Types (Optional)
Custom RDF namespaces for richer semantics:
### Constraints
| `sh:minInclusive` | Minimum value | `sh:minInclusive 0 ;` → Validation added |
| `sh:maxInclusive` | Maximum value | `sh:maxInclusive 100 ;` → Range check |
| `sh:minLength` | String length | `sh:minLength 3 ;` → Length validation |
| `sh:maxLength` | String length | `sh:maxLength 50 ;` → Length check |
| `sh:pattern` | Regex pattern | `sh:pattern "[a-z]+";` → Regex validation |
| `rdfs:comment` | Documentation | `rdfs:comment "User's email"` → Doc comment |
| `rdfs:label` | Human-readable | `rdfs:label "Email Address"` → Property name |
### Relationships
| `rdf:Property` (object) | Reference to another class | Method or field returning related object |
| `rdf:type` of `rdfs:Class` | Class definition | `pub struct` / `interface` / `class` |
| `rdfs:domain` | Property ownership | Indicates which class owns property |
| `rdfs:range` | Property type | Determines generated type |
## Type Mapping Examples
### Example 1: Simple Entity
**RDF Ontology:**
```turtle
@prefix ex: <http://example.org/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
ex:User a rdfs:Class ;
rdfs:label "User" ;
rdfs:comment "Platform user account" .
ex:email a rdf:Property ;
rdfs:domain ex:User ;
rdfs:range xsd:string ;
rdfs:label "email" ;
sh:pattern "[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,}" .
ex:age a rdf:Property ;
rdfs:domain ex:User ;
rdfs:range xsd:integer ;
rdfs:label "age" ;
sh:minInclusive 0 ;
sh:maxInclusive 150 .
```
**Generated Rust:**
```rust
pub struct User {
pub email: String, // Pattern validation from sh:pattern
pub age: i32, // Range validation from sh:minInclusive/maxInclusive
}
```
**Generated TypeScript:**
```typescript
interface User {
email: string; // Pattern validation
age: number; // Range validation
}
```
**Generated Python:**
```python
@dataclass
class User:
email: str # Pattern validation
age: int # Range validation
```
### Example 2: Relationships
**RDF Ontology:**
```turtle
ex:Order a rdfs:Class .
ex:User a rdfs:Class .
ex:orderedBy a rdf:Property ;
rdfs:domain ex:Order ;
rdfs:range ex:User ;
rdfs:label "orderedBy" .
ex:totalAmount a rdf:Property ;
rdfs:domain ex:Order ;
rdfs:range xsd:decimal ;
rdfs:label "totalAmount" ;
sh:minInclusive 0.01 .
```
**Generated Rust:**
```rust
pub struct Order {
pub total_amount: f64,
}
impl Order {
pub fn get_ordered_by(&self) -> User {
// Load User from relationship
}
}
```
**Generated TypeScript:**
```typescript
interface Order {
totalAmount: number;
}
function getOrderedBy(order: Order): User {
// Load User from relationship
}
```
### Example 3: Complex Types
**RDF Ontology:**
```turtle
ex:Event a rdfs:Class .
ex:startDate a rdf:Property ;
rdfs:domain ex:Event ;
rdfs:range xsd:dateTime ;
rdfs:label "startDate" .
ex:tags a rdf:Property ;
rdfs:domain ex:Event ;
rdfs:range xsd:string ;
rdfs:label "tags" .
```
**Generated Rust:**
```rust
pub struct Event {
pub start_date: chrono::DateTime<chrono::Utc>,
pub tags: Vec<String>,
}
```
**Generated TypeScript:**
```typescript
interface Event {
startDate: Date;
tags: string[];
}
```
## Null/Optional Handling
Properties can be marked as optional:
```turtle
ex:middleName a rdf:Property ;
rdfs:domain ex:User ;
rdfs:range xsd:string ;
rdfs:label "middleName" ;
rdfs:comment "Optional middle name" . {# Presence of comment with "Optional" triggers nullable #}
```
**Generated Rust:**
```rust
pub struct User {
pub first_name: String,
pub middle_name: Option<String>, // Optional based on comment
pub last_name: String,
}
```
**Generated TypeScript:**
```typescript
interface User {
firstName: string;
middleName?: string; // Optional
lastName: string;
}
```
## Collection Types
Arrays and collections are inferred from semantic patterns:
```turtle
ex:products a rdf:Property ;
rdfs:domain ex:Order ;
rdfs:range ex:Product ;
rdfs:label "products" ;
rdfs:comment "List of products in order" . {# "List" triggers Vec/[] #}
```
**Generated Rust:**
```rust
pub struct Order {
pub products: Vec<Product>,
}
```
**Generated TypeScript:**
```typescript
interface Order {
products: Product[];
}
```
## Validation Rules
Validation constraints are extracted and applied:
| `sh:minInclusive` | `.min()` validation | Range check in setter | `value >= min` assertion |
| `sh:maxInclusive` | `.max()` validation | Range check in setter | `value <= max` assertion |
| `sh:minLength` | `.len() >=` | Length check | `len() >=` check |
| `sh:maxLength` | `.len() <=` | Length check | `len() <=` check |
| `sh:pattern` | Regex validation | Pattern test | `re.match()` check |
## Custom Type Mappings
Override default mappings by extending the template:
```tera
{% if prop.range == "xsd:decimal" %}
{{- prop.rust_type = "rust_decimal::Decimal" -}}
{% endif %}
```
## Common Patterns
### Financial Values
Use `xsd:decimal` with `sh:minInclusive 0` for monetary amounts.
### Timestamps
Use `xsd:dateTime` for event times; ggen automatically adds timezone handling.
### Identifiers
Use `xsd:string` with `sh:pattern` for IDs (UUID, email, SKU).
### Enumerations
Use `rdfs:comment` with comma-separated values to generate enums:
```turtle
ex:status a rdf:Property ;
rdfs:range xsd:string ;
rdfs:comment "active, inactive, pending" . {# Generates enum #}
```
## Troubleshooting
**Q: My property type isn't being recognized**
A: Ensure `rdfs:range` is set explicitly. ggen uses `rdfs:range` to determine type.
**Q: Validation isn't being added to generated code**
A: Add SHACL constraints (`sh:minInclusive`, `sh:pattern`, etc.) to your ontology.
**Q: Optional/nullable fields aren't being generated**
A: Add "Optional" or "nullable" in the `rdfs:comment` of the property.
## See Also
- [RDF/SPARQL Reference](rdf-sparql.md) - RDF syntax and SPARQL queries
- [Template Reference](templates.md) - Template syntax and directives
- [Ontology-Driven Development](../explanations/ontology-driven.md) - Conceptual overview