# Semantic Data

**WORK IN PROGRESS**

## Schema

### Datatypes

```
enum Datatype (
  Bool
  Integer
  Decimal
  String
  DateTime
  Date
  Time
  Duration
  QuantityValue(Unit)
  Range(Datatype)
  Geography
  Species
  Chemical
)
```

### Namespaces

```
tx CreateNamespace(name string) HashURI
```

### Properties

#### Data Properties

```
tx CreateDataProperty(
  namespace HashURI,
  name string,
  datatype Datatype,
  arity Arity
)
```

#### Object Properties

```
tx CreateObjectProperty(
  namespace HashURI,
  name string,
  cls HashIRI,
  arity Arity,
  superProperties HashURI*
)
```

#### Arity

```
enum Arity (
  One,
  Ordered,
  Unordered
)
```

### Classes

```
tx CreateClass(
  namespace HashURI,
  name string,
  requiredProperties HashURI*,
  superClasses HashURI*
)
```

## Transactions

## Storing Graph Data

```go
tx StoreGraph(data bytes) HashURI
```

### Storing Part of a Graph

```
tx StorePartialData(iri HashIRI, proofs ics23.ExistenceProof*)
```

### Deleting Data

```
// this would allow the person who committed data to remove it from state
// but not from transaction history - maybe no point in even considering this
@experimental tx DeleteData(iri HashIRI)
```

## State

```
table Namespace {
  iri: HashIRI
  owner: Address
  name: string
  @primary_key(iri)
  @unique(owner, name)
  @index(owner)
}

enum ObjType {
  DataProperty,
  ObjectProperty,
  Class
}

table Object {
  iri: HashIRI
  namespace: HashIRI
  name: string
  type: ObjType
  datatype: Datatype?
  cls: HashIRI?
  arity: Arity?
  super_properties: HashIRI*
  super_classes: HashIRI*
  required_properties: HashIRI*
  @primary_key(iri)
  @unique(namespace, name)
  @index(namespace)
}

table Data {
  iri: HashIRI
  data: bytes?
  partial: ics23.ExistenceProof*
  @primary_key(iri)
}
```
