hydra-0.8.0: src/main/haskell/Hydra/Sources/Tier4/Ext/Pg/Model.hs
{-# LANGUAGE OverloadedStrings #-}
module Hydra.Sources.Tier4.Ext.Pg.Model where
import Hydra.Sources.Tier3.All
import Hydra.Dsl.Annotations
import Hydra.Dsl.Bootstrap
import Hydra.Dsl.Types as Types
import Hydra.Sources.Core
pgModelModule :: Module
pgModelModule = Module ns elements [] tier0Modules $
Just ("A typed property graph data model. " ++
"Property graphs are parameterized a type for property and id values, " ++
"while property graph schemas are parameterized by a type for property and id types")
where
ns = Namespace "hydra/pg/model"
pg = typeref ns
def = datatype ns
elements = [
def "Direction" $
doc "The direction of an edge or edge pattern" $
enum ["out", "in", "both", "undirected"],
def "Edge" $
doc "An edge" $
lambda "v" $ record [
"label">:
doc "The label of the edge" $
pg "EdgeLabel",
"id">:
doc "The unique identifier of the edge"
"v",
"out">:
doc "The id of the out-vertex (tail) of the edge"
"v",
"in">:
doc "The id of the in-vertex (head) of the edge"
"v",
"properties">:
doc "A key/value map of edge properties" $
Types.map (pg "PropertyKey") "v"],
def "EdgeLabel" $
doc "The label of an edge" $
string,
def "EdgeType" $
doc "The type of an edge" $
lambda "t" $ record [
"label">:
doc "The label of any edge of this edge type" $
pg "EdgeLabel",
"id">:
doc "The type of the id of any edge of this edge type"
"t",
"out">:
doc "The label of the out-vertex (tail) of any edge of this edge type" $
pg "VertexLabel",
"in">:
doc "The label of the in-vertex (head) of any edge of this edge type" $
pg "VertexLabel",
"properties">:
doc "A list of property types. The types are ordered for the sake of applications in which property order is significant." $
list (pg "PropertyType" @@ "t")],
def "Element" $
doc "Either a vertex or an edge" $
lambda "v" $ union [
"vertex">: pg "Vertex" @@ "v",
"edge">: pg "Edge" @@ "v"],
def "ElementKind" $
doc "The kind of an element: vertex or edge" $
enum ["vertex", "edge"],
def "ElementTree" $
doc "An element together with its dependencies in some context" $
lambda "v" $ record [
"self">: pg "Element" @@ "v",
"dependencies">: Types.list $ pg "ElementTree" @@ "v"],
def "ElementType" $
doc "The type of a vertex or edge" $
lambda "t" $ union [
"vertex">: pg "VertexType" @@ "t",
"edge">: pg "EdgeType" @@ "t"],
def "ElementTypeTree" $
doc "An element type together with its dependencies in some context" $
lambda "t" $ record [
"self">: pg "ElementType" @@ "t",
"dependencies">: Types.list $ pg "ElementTypeTree" @@ "t"],
def "Graph" $
doc "A graph; a self-contained collection of vertices and edges" $
lambda "v" $ record [
"vertices">: Types.map "v" $ pg "Vertex" @@ "v",
"edges">: Types.map "v" $ pg "Edge" @@ "v"],
def "GraphSchema" $
doc "A graph schema; a vertex and edge types for the vertices and edges of a graph conforming to the schema" $
lambda "t" $ record [
"vertices">:
doc "A unique vertex type for each vertex label which may occur in a graph" $
Types.map (pg "VertexLabel") (pg "VertexType" @@ "t"),
"edges">:
doc "A unique edge type for each edge label which may occur in a graph" $
Types.map (pg "EdgeLabel") (pg "EdgeType" @@ "t")],
def "Label" $
doc "Either a vertex or edge label" $
union [
"vertex">: pg "VertexLabel",
"edge">: pg "EdgeLabel"],
def "Property" $
doc "A key/value property" $
lambda "v" $ record [
"key">:
doc "They key of the property" $
pg "PropertyKey",
"value">:
doc "The value of the property"
"v"],
def "PropertyKey" $
doc "A property key"
string,
def "PropertyType" $
doc "The type of a property" $
lambda "t" $ record [
"key">:
doc "A property's key" $
pg "PropertyKey",
"value">:
doc "The type of a property's value"
"t",
"required">:
doc "Whether the property is required; values may be omitted from a property map otherwise"
boolean],
def "Vertex" $
doc "A vertex" $
lambda "v" $ record [
"label">:
doc "The label of the vertex" $
pg "VertexLabel",
"id">:
doc "The unique identifier of the vertex"
"v",
"properties">:
doc "A key/value map of vertex properties" $
Types.map (pg "PropertyKey") "v"],
def "VertexLabel" $
doc "The label of a vertex. The default (null) vertex is represented by the empty string" $
string,
def "VertexType" $
doc "The type of a vertex" $
lambda "t" $ record [
"label">:
doc "The label of any vertex of this vertex type" $
pg "VertexLabel",
"id">:
doc "The type of the id of any vertex of this vertex type"
"t",
"properties">:
doc "A list of property types. The types are ordered for the sake of applications in which property order is significant." $
list (pg "PropertyType" @@ "t")]]