RDFLib / rdflib

RDFLib is a Python library for working with RDF, a simple yet powerful language for representing information.
https://rdflib.readthedocs.org
BSD 3-Clause "New" or "Revised" License
2.17k stars 556 forks source link

Potentially missing terms in PROV namespace #1308

Closed aucampia closed 3 years ago

aucampia commented 3 years ago

Currently there are some terms defined in http://www.w3.org/ns/prov.ttl that are not in rdflib.namespace.PROV.

The only missing terms that match [] rdfs:isDefinedBy <http://www.w3.org/ns/prov-o#> . are [] rdf:type owl:AnnotationProperty ., but rdflib.namespace.PROV already contains some terms which are annotation properties such as wasRevisionOf and specializationOf, however these terms are also object properties, so I guess there is some argument to be made the extra properties should not be in rdflib.namespace.PROV, however at the very least the inclusion criteria for rdflib.namespace.PROV should be clarified and documented in it's docstring.

I made a test to check it which can be found here: https://gitlab.com/aucampia/contrib/rdflib/-/blob/master/tests/test_namespace.py#L17

Output of the test is below, first element in tuples are the term URI, second is the ontology it was defined in.

$ FAILTESTS=1 poetry run nosetests -c nose.cfg tests.test_namespace:Namespace.test_prov
test_prov (tests.test_namespace.Namespace) ... FAIL

======================================================================
FAIL: test_prov (tests.test_namespace.Namespace)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/iwana/syncthing/sw-wpw/d/gitlab.com/aucampia/contrib/rdflib/tests/test_namespace.py", line 71, in test_prov
    self.assertEqual(stated_term_set, defined_term_set)
AssertionError: Items in the first set but not the second:
(rdflib.term.URIRef('http://www.w3.org/ns/prov#Contribute'), None)
(rdflib.term.URIRef('http://www.w3.org/ns/prov#qualifiedDerivationOf'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#qualifiedAssociationOf'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#ServiceDescription'), rdflib.term.URIRef('http://www.w3.org/ns/prov#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#qualifiedUsingActivity'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#sharesDefinitionWith'), rdflib.term.URIRef('http://www.w3.org/ns/prov#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#definition'), rdflib.term.URIRef('http://www.w3.org/ns/prov#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#has_query_service'), rdflib.term.URIRef('http://www.w3.org/ns/prov#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#Creator'), None)
(rdflib.term.URIRef('http://www.w3.org/ns/prov#Removal'), rdflib.term.URIRef('http://www.w3.org/ns/prov#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#wasAssociateFor'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#unqualifiedForm'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#editorialNote'), rdflib.term.URIRef('http://www.w3.org/ns/prov#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#has_anchor'), rdflib.term.URIRef('http://www.w3.org/ns/prov#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#wasPrimarySourceOf'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#Copyright'), None)
(rdflib.term.URIRef('http://www.w3.org/ns/prov#qualifiedQuotationOf'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#hadDictionaryMember'), rdflib.term.URIRef('http://www.w3.org/ns/prov#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#qualifiedDelegationOf'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#wasActivityOfInfluence'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#KeyEntityPair'), rdflib.term.URIRef('http://www.w3.org/ns/prov#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#qualifiedSourceOf'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#Insertion'), rdflib.term.URIRef('http://www.w3.org/ns/prov#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#DirectQueryService'), rdflib.term.URIRef('http://www.w3.org/ns/prov#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#EmptyDictionary'), rdflib.term.URIRef('http://www.w3.org/ns/prov#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#started'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#Accept'), None)
(rdflib.term.URIRef('http://www.w3.org/ns/prov#order'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#asInBundle'), rdflib.term.URIRef('http://www.w3.org/ns/prov-links#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#Dictionary'), rdflib.term.URIRef('http://www.w3.org/ns/prov#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#wasUsedInDerivation'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#todo'), None)
(rdflib.term.URIRef('http://www.w3.org/ns/prov#qualifiedForm'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#RightsAssignment'), None)
(rdflib.term.URIRef('http://www.w3.org/ns/prov#category'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#qualifiedInfluenceOf'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#qualifiedInvalidationOf'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#editorsDefinition'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#Publisher'), None)
(rdflib.term.URIRef('http://www.w3.org/ns/prov#generalizationOf'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#wasPlanOf'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#entityOfInfluence'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#RightsHolder'), None)
(rdflib.term.URIRef('http://www.w3.org/ns/prov#qualifiedInsertion'), rdflib.term.URIRef('http://www.w3.org/ns/prov#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#ended'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#revisedEntity'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#derivedByInsertionFrom'), rdflib.term.URIRef('http://www.w3.org/ns/prov#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#describesService'), rdflib.term.URIRef('http://www.w3.org/ns/prov#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#locationOf'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#pairEntity'), rdflib.term.URIRef('http://www.w3.org/ns/prov#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#qualifiedEndOf'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#provenanceUriTemplate'), rdflib.term.URIRef('http://www.w3.org/ns/prov#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#qualifiedAttributionOf'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#mentionOf'), rdflib.term.URIRef('http://www.w3.org/ns/prov-links#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#aq'), rdflib.term.URIRef('http://www.w3.org/ns/prov#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#Publish'), None)
(rdflib.term.URIRef('http://www.w3.org/ns/prov#agentOfInfluence'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#Contributor'), None)
(rdflib.term.URIRef('http://www.w3.org/ns/prov#generatedAsDerivation'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#qualifiedCommunicationOf'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#has_provenance'), rdflib.term.URIRef('http://www.w3.org/ns/prov#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#insertedKeyEntityPair'), rdflib.term.URIRef('http://www.w3.org/ns/prov#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#hadDelegate'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#informed'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#removedKey'), rdflib.term.URIRef('http://www.w3.org/ns/prov#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#component'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#hadDerivation'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#wasRoleIn'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#quotedAs'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#qualifiedGenerationOf'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#derivedByRemovalFrom'), rdflib.term.URIRef('http://www.w3.org/ns/prov#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#n'), rdflib.term.URIRef('http://www.w3.org/ns/prov#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#constraints'), rdflib.term.URIRef('http://www.w3.org/ns/prov#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#Create'), None)
(rdflib.term.URIRef('http://www.w3.org/ns/prov#dm'), rdflib.term.URIRef('http://www.w3.org/ns/prov#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#contributed'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#pingback'), rdflib.term.URIRef('http://www.w3.org/ns/prov#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#activityOfInfluence'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#pairKey'), rdflib.term.URIRef('http://www.w3.org/ns/prov#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#wasUsedBy'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#qualifiedRemoval'), rdflib.term.URIRef('http://www.w3.org/ns/prov#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#qualifiedStartOf'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#hadInfluence'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#inverse'), rdflib.term.URIRef('http://www.w3.org/ns/prov#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#Submit'), None)
(rdflib.term.URIRef('http://www.w3.org/ns/prov#wasMemberOf'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#dictionary'), rdflib.term.URIRef('http://www.w3.org/ns/prov#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#hadRevision'), rdflib.term.URIRef('http://www.w3.org/ns/prov-o-inverses#'))
(rdflib.term.URIRef('http://www.w3.org/ns/prov#Replace'), None)
(rdflib.term.URIRef('http://www.w3.org/ns/prov#Modify'), None)

----------------------------------------------------------------------
Ran 1 test in 1.901s

FAILED (failures=1)
nicholascar commented 3 years ago

Since the CloseNamespace class is just to be used like type hinting - to help people do the right thing - all PROV terms should be present.

Double checking, I make the missing terms to be:

[
  'aq',
  'category',
  'component',
  'constraints',
  'definition',
  'dm',
  'editorialNote',
  'editorsDefinition',
  'inverse',
  'n',
  'order',
  'qualifiedForm',
  'sharesDefinitionWith',
  'unqualifiedForm'
]

It seems that PROV mistakenly claims to define two RDFS terms:

rdfs:comment
  rdf:type owl:AnnotationProperty ;
  rdfs:comment ""@en ;
  rdfs:isDefinedBy <http://www.w3.org/ns/prov-o#> ;
.
rdfs:label
  rdf:type owl:AnnotationProperty ;
  rdfs:comment ""@en ;
  rdfs:isDefinedBy <http://www.w3.org/ns/prov-o#> ;
.

So, ignoring those, I'll just add the missing terms.