packages feed

yaml2owl-0.0.1: src/Yaml2Schema.hs

{-# LANGUAGE OverloadedStrings #-}

module Yaml2Schema ( json2graph ) where

import Prelude hiding ((/))
import Data.Text (Text, splitOn, unpack)
import Data.Map (Map, toList)

import Network.URI (URI(..), URIAuth(..))

import Data.Set (fromList)

import Swish.RDF
import Swish.Namespace (ScopedName, makeScopedName)
import Swish.QName (newLName)
import Swish.RDF.Vocabulary.XSD
import Swish.RDF.Vocabulary.OWL

type TextMap = Map Text
type MapMap = TextMap (TextMap Text)

url :: String -> String -> URI
url domain path = URI "http:" (Just $ URIAuth "" domain "") ('/':path) "" ""

(/) :: String -> String -> URI
domain / path = url domain path

ex :: Text -> ScopedName
ex lname = maybe (error $ "Invalid chars in local name: " ++ unpack lname) (makeScopedName (Just "ex") ("example.org"/"scheme#")) $ newLName lname

resolve :: Text -> ScopedName
resolve n = case splitOn ":" n of
  [name] -> ex name
  [prefix, name] -> error "Not implemented yet"

json2graph :: MapMap -> RDFGraph
json2graph = toRDFGraph . fromList . json2triples

json2triples :: MapMap -> [RDFTriple]
json2triples m = do
  (subj, assertions) <- toList m
  let klass = Res (ex subj)
  (Arc klass resRdfType resRdfsClass) : concat (map (props klass) (toList assertions))

props ::RDFLabel -> (Text, Text)-> [RDFTriple]
props domain (p, r) = [
    toRDFTriple prop resRdfType typ,  
    toRDFTriple prop resRdfsDomain domain,  
    toRDFTriple prop resRdfsRange range
  ]
    where
      prop = resolve p
      (range, typ) = case r of
        "String" -> (xsdString, owlDatatypeProperty)
        "Int" -> (xsdInteger, owlDatatypeProperty)
        other -> (resolve other, owlObjectProperty)