/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 * This work (Java class) is a derivative from an original OWL ontology:
 * 
 *	  wfprov ontology
 *	  https://w3id.org/ro/wfprov
 *	  Wf4Ever Research Object Model 1.0 
 *	  https://w3id.org/ro/
 *	  
 *	  (c) 2011-2014 
 *	    Stian Soiland-Reyes, University of Manchester
 *	    Sean Bechhofer, University of Manchester
 *	    Khalid Belhajjame, University of Manchester
 *	    Graham Klyne, University of Oxford
 *	    Daniel Garijo, UPM
 *	    Oscar Corcho, UPM
 *	    Esteban García Cuesta, iSOCO
 *	    Raul Palma, PSNC
 *	 
 *	  Original work used according to 
 *	  Creative Commons Attribution 3.0 License.
 *	  http://creativecommons.org/licenses/by/3.0/
 *	  
 */
package org.apache.taverna.scufl2.wfdesc.ontologies; 
import org.apache.jena.rdf.model.*;
import org.apache.jena.ontology.*;
 
/**
 * Vocabulary definitions from file:/home/stain/src/incubator-taverna-language/taverna-scufl2-wfdesc/src/main/resources/org/purl/wf4ever/wfdesc/wfprov.ttl 
 * @author Auto-generated by schemagen on 21 Nov 2018 10:58 
 */
public class Wfprov {
    /** <p>The ontology model that holds the vocabulary terms</p> */
    private static final OntModel M_MODEL = ModelFactory.createOntologyModel( OntModelSpec.OWL_MEM, null );
    
    /** <p>The namespace of the vocabulary as a string</p> */
    public static final String NS = "http://purl.org/wf4ever/wfprov#";
    
    /** <p>The namespace of the vocabulary as a string</p>
     * @return namespace as String
     * @see #NS */
    public static String getURI() {return NS;}
    
    /** <p>The namespace of the vocabulary as a resource</p> */
    public static final Resource NAMESPACE = M_MODEL.createResource( NS );
    
    /** <p>This object property is used to associate a wfprov:Artifact to the wfdesc:Parameter 
     *  description.</p>
     */
    public static final ObjectProperty describedByParameter = M_MODEL.createObjectProperty( "http://purl.org/wf4ever/wfprov#describedByParameter" );
    
    /** <p>This object property associate a wfprov:Processrun to its wfdesc:Process description 
     *  .</p>
     */
    public static final ObjectProperty describedByProcess = M_MODEL.createObjectProperty( "http://purl.org/wf4ever/wfprov#describedByProcess" );
    
    /** <p>This property associates a wfprov:WorkflowRun to its corresponding wfdesc:Workflow 
     *  description.</p>
     */
    public static final ObjectProperty describedByWorkflow = M_MODEL.createObjectProperty( "http://purl.org/wf4ever/wfprov#describedByWorkflow" );
    
    /** <p>This property specifies that a wfprov:ProcessRun used an wfprov:Artifact as 
     *  an input</p>
     */
    public static final ObjectProperty usedInput = M_MODEL.createObjectProperty( "http://purl.org/wf4ever/wfprov#usedInput" );
    
    /** <p>wfprov:wasEnactedBy associates a wfprov:ProcessRun with a wfprov:WorkflowEngine, 
     *  specifying that the execution of the process was enacted by the engine.</p>
     */
    public static final ObjectProperty wasEnactedBy = M_MODEL.createObjectProperty( "http://purl.org/wf4ever/wfprov#wasEnactedBy" );
    
    /** <p>This property specifies that a wfprov:Artifact was generated as an output 
     *  from a wfprov:ProcessRun</p>
     */
    public static final ObjectProperty wasOutputFrom = M_MODEL.createObjectProperty( "http://purl.org/wf4ever/wfprov#wasOutputFrom" );
    
    /** <p>This property specifies that a wfprov:ProcessRun was executed as part of a 
     *  wfprov:WorkflowRun. This typically corresponds to wfdesc:hasSubProcess in 
     *  the workflow description.</p>
     */
    public static final ObjectProperty wasPartOfWorkflowRun = M_MODEL.createObjectProperty( "http://purl.org/wf4ever/wfprov#wasPartOfWorkflowRun" );
    
    /** <p>An artifact is a data value or item which wfprov:wasOutputFrom of a wfprov:ProcessRun 
     *  or that the process run used as input (wfprov:usedInput). Such an artifact 
     *  might also be a ro:Resource if it has been aggregated in the ro:ResearchObject 
     *  (typically if the artifact was used or generated by a wfprov:WorkflowRun) 
     *  - but this might always not be the case for intermediate values from wfprov:ProcessRun.</p>
     */
    public static final OntClass Artifact = M_MODEL.createClass( "http://purl.org/wf4ever/wfprov#Artifact" );
    
    /** <p>A process run is a particular execution of a wfdesc:Process description (wfprov:describedByProcess), 
     *  which can wfprov:usedInput some wfprov:Artifact instances, and produce new 
     *  artifacts (wfprov:wasOutputFrom). A wfprov:WorkflowRun is a specialisation 
     *  of this class.</p>
     */
    public static final OntClass ProcessRun = M_MODEL.createClass( "http://purl.org/wf4ever/wfprov#ProcessRun" );
    
    /** <p>A workflow engine is an foaf:Agent that is responsible for enacting a workflow 
     *  definition (which could be described in a wfdesc:Workflow). The result of 
     *  workflow enactment gives rise to a wfprov:WorkflowRun.</p>
     */
    public static final OntClass WorkflowEngine = M_MODEL.createClass( "http://purl.org/wf4ever/wfprov#WorkflowEngine" );
    
    /** <p>A workflow run is a wfprov:ProcessRun which have been enacted by a wfprov:WorkflowEngine, 
     *  according to a workflow definition (which could be wfdesc:describedByWorkflow 
     *  a wfdesc:Workflow). Such a process typically contains several subprocesses 
     *  (wfprov:wasPartOfWorkflowRun) corresponding to wfdesc:Process descriptions</p>
     */
    public static final OntClass WorkflowRun = M_MODEL.createClass( "http://purl.org/wf4ever/wfprov#WorkflowRun" );
    
}
