sig
  type options = (string * string) list
  val get_option : ?def:string -> string -> Rdf_graph.options -> string
  module type Storage =
    sig
      val name : string
      type g
      type error
      exception Error of Rdf_graph.Storage.error
      val string_of_error : Rdf_graph.Storage.error -> string
      val open_graph :
        ?options:(string * string) list -> Rdf_uri.uri -> Rdf_graph.Storage.g
      val graph_name : Rdf_graph.Storage.g -> Rdf_uri.uri
      val add_triple :
        Rdf_graph.Storage.g ->
        sub:Rdf_node.node -> pred:Rdf_node.node -> obj:Rdf_node.node -> unit
      val rem_triple :
        Rdf_graph.Storage.g ->
        sub:Rdf_node.node -> pred:Rdf_node.node -> obj:Rdf_node.node -> unit
      val add_triple_t : Rdf_graph.Storage.g -> Rdf_node.triple -> unit
      val rem_triple_t : Rdf_graph.Storage.g -> Rdf_node.triple -> unit
      val subjects_of :
        Rdf_graph.Storage.g ->
        pred:Rdf_node.node -> obj:Rdf_node.node -> Rdf_node.node list
      val predicates_of :
        Rdf_graph.Storage.g ->
        sub:Rdf_node.node -> obj:Rdf_node.node -> Rdf_node.node list
      val objects_of :
        Rdf_graph.Storage.g ->
        sub:Rdf_node.node -> pred:Rdf_node.node -> Rdf_node.node list
      val find :
        ?sub:Rdf_node.node ->
        ?pred:Rdf_node.node ->
        ?obj:Rdf_node.node -> Rdf_graph.Storage.g -> Rdf_node.triple list
      val exists :
        ?sub:Rdf_node.node ->
        ?pred:Rdf_node.node ->
        ?obj:Rdf_node.node -> Rdf_graph.Storage.g -> bool
      val exists_t : Rdf_node.triple -> Rdf_graph.Storage.g -> bool
      val subjects : Rdf_graph.Storage.g -> Rdf_node.node list
      val predicates : Rdf_graph.Storage.g -> Rdf_node.node list
      val objects : Rdf_graph.Storage.g -> Rdf_node.node list
      val transaction_start : Rdf_graph.Storage.g -> unit
      val transaction_commit : Rdf_graph.Storage.g -> unit
      val transaction_rollback : Rdf_graph.Storage.g -> unit
      val new_blank_id : Rdf_graph.Storage.g -> Rdf_node.blank_id
    end
  exception Storage_error of string * string * exn
  module type Graph =
    sig
      type g
      val open_graph :
        ?options:(string * string) list -> Rdf_uri.uri -> Rdf_graph.Graph.g
      val graph_name : Rdf_graph.Graph.g -> Rdf_uri.uri
      val add_triple :
        Rdf_graph.Graph.g ->
        sub:Rdf_node.node -> pred:Rdf_node.node -> obj:Rdf_node.node -> unit
      val rem_triple :
        Rdf_graph.Graph.g ->
        sub:Rdf_node.node -> pred:Rdf_node.node -> obj:Rdf_node.node -> unit
      val add_triple_t : Rdf_graph.Graph.g -> Rdf_node.triple -> unit
      val rem_triple_t : Rdf_graph.Graph.g -> Rdf_node.triple -> unit
      val subjects_of :
        Rdf_graph.Graph.g ->
        pred:Rdf_node.node -> obj:Rdf_node.node -> Rdf_node.node list
      val predicates_of :
        Rdf_graph.Graph.g ->
        sub:Rdf_node.node -> obj:Rdf_node.node -> Rdf_node.node list
      val objects_of :
        Rdf_graph.Graph.g ->
        sub:Rdf_node.node -> pred:Rdf_node.node -> Rdf_node.node list
      val find :
        ?sub:Rdf_node.node ->
        ?pred:Rdf_node.node ->
        ?obj:Rdf_node.node -> Rdf_graph.Graph.g -> Rdf_node.triple list
      val exists :
        ?sub:Rdf_node.node ->
        ?pred:Rdf_node.node ->
        ?obj:Rdf_node.node -> Rdf_graph.Graph.g -> bool
      val exists_t : Rdf_node.triple -> Rdf_graph.Graph.g -> bool
      val subjects : Rdf_graph.Graph.g -> Rdf_node.node list
      val predicates : Rdf_graph.Graph.g -> Rdf_node.node list
      val objects : Rdf_graph.Graph.g -> Rdf_node.node list
      val transaction_start : Rdf_graph.Graph.g -> unit
      val transaction_commit : Rdf_graph.Graph.g -> unit
      val transaction_rollback : Rdf_graph.Graph.g -> unit
      val new_blank_id : Rdf_graph.Graph.g -> Rdf_node.blank_id
    end
  module Make :
    functor (S : Storage->
      sig
        type g = S.g
        val open_graph : ?options:(string * string) list -> Rdf_uri.uri -> g
        val graph_name : g -> Rdf_uri.uri
        val add_triple :
          g ->
          sub:Rdf_node.node ->
          pred:Rdf_node.node -> obj:Rdf_node.node -> unit
        val rem_triple :
          g ->
          sub:Rdf_node.node ->
          pred:Rdf_node.node -> obj:Rdf_node.node -> unit
        val add_triple_t : g -> Rdf_node.triple -> unit
        val rem_triple_t : g -> Rdf_node.triple -> unit
        val subjects_of :
          g -> pred:Rdf_node.node -> obj:Rdf_node.node -> Rdf_node.node list
        val predicates_of :
          g -> sub:Rdf_node.node -> obj:Rdf_node.node -> Rdf_node.node list
        val objects_of :
          g -> sub:Rdf_node.node -> pred:Rdf_node.node -> Rdf_node.node list
        val find :
          ?sub:Rdf_node.node ->
          ?pred:Rdf_node.node ->
          ?obj:Rdf_node.node -> g -> Rdf_node.triple list
        val exists :
          ?sub:Rdf_node.node ->
          ?pred:Rdf_node.node -> ?obj:Rdf_node.node -> g -> bool
        val exists_t : Rdf_node.triple -> g -> bool
        val subjects : g -> Rdf_node.node list
        val predicates : g -> Rdf_node.node list
        val objects : g -> Rdf_node.node list
        val transaction_start : g -> unit
        val transaction_commit : g -> unit
        val transaction_rollback : g -> unit
        val new_blank_id : g -> Rdf_node.blank_id
      end
  val add_storage : (module Rdf_graph.Storage-> unit
  type graph = {
    name : unit -> Rdf_uri.uri;
    add_triple :
      sub:Rdf_node.node -> pred:Rdf_node.node -> obj:Rdf_node.node -> unit;
    rem_triple :
      sub:Rdf_node.node -> pred:Rdf_node.node -> obj:Rdf_node.node -> unit;
    add_triple_t : Rdf_node.node * Rdf_node.node * Rdf_node.node -> unit;
    rem_triple_t : Rdf_node.node * Rdf_node.node * Rdf_node.node -> unit;
    subjects_of :
      pred:Rdf_node.node -> obj:Rdf_node.node -> Rdf_node.node list;
    predicates_of :
      sub:Rdf_node.node -> obj:Rdf_node.node -> Rdf_node.node list;
    objects_of :
      sub:Rdf_node.node -> pred:Rdf_node.node -> Rdf_node.node list;
    find :
      ?sub:Rdf_node.node ->
      ?pred:Rdf_node.node ->
      ?obj:Rdf_node.node -> unit -> Rdf_node.triple list;
    exists :
      ?sub:Rdf_node.node ->
      ?pred:Rdf_node.node -> ?obj:Rdf_node.node -> unit -> bool;
    exists_t : Rdf_node.triple -> bool;
    subjects : unit -> Rdf_node.node list;
    predicates : unit -> Rdf_node.node list;
    objects : unit -> Rdf_node.node list;
    transaction_start : unit -> unit;
    transaction_commit : unit -> unit;
    transaction_rollback : unit -> unit;
    new_blank_id : unit -> Rdf_node.blank_id;
    namespaces : unit -> (Rdf_uri.uri * string) list;
  }
  val open_graph :
    ?options:(string * string) list -> Rdf_uri.uri -> Rdf_graph.graph
  val merge : Rdf_graph.graph -> Rdf_graph.graph -> unit
end