from rdflib import Namespace, RDF, RDFS, ConjunctiveGraph
from skos import schema, statements

SKOS = Namespace('http://www.w3.org/2004/02/skos/core#')
OWL = Namespace('http://www.w3.org/2002/07/owl#')
DC = Namespace('http://purl.org/dc/elements/1.1/')
DCT = Namespace('http://purl.org/dc/terms/')

# #####################################
# begin testing
# #####################################

# open report file
report = file('./check-schema-report.txt','w')

# load Sean's schema
sean = ConjunctiveGraph()
sean.parse('./skos.rdf')

# check statements against generated semantics
report.write('== Checking for Triples Missing from Formal Schema ==\n')
i = 1
for s in statements() :
    report.write('\nChecking statement S'+str(i)+'...')
    ok = 1
    for triple in s :
        if triple not in sean :
            ok = 0
            report.write('\n * triple not found: '+str(triple))
    if ok :
        report.write(' OK')        
    i = i+1

ignore = set()
ignore.add(RDF.value)
ignore.add(RDFS.isDefinedBy)
ignore.add(RDFS.label)
ignore.add(RDFS.comment)
ignore.add(RDFS.isDefinedBy)
ignore.add(DC['creator'])
ignore.add(DC['contributor'])
ignore.add(DC['date'])
ignore.add(DC['title'])
ignore.add(DC['description'])
ignore.add(DCT['issued'])
ignore.add(SKOS['definition'])
ignore.add(SKOS['changeNote'])

report.write('\n\n== Checking for Extra Triples In Formal Schema, Not Stated in SKOS Reference ==\n\n')

for triple in sean.triples((None, None, None)) :
    if triple not in schema().triples((None, None, None)) :
        if triple[1] not in ignore :
            print triple[1]
            report.write(' * extra triple: '+str(triple)+'\n')

report.flush()
report.close()
    