Internet-Draft | An Ontology for RFCs | July 2024 |
Petit-Huguenin | Expires 21 January 2025 | [Page] |
This document defines an ontology that describes the specifications published by the RFC Editor, together with ancillary documents.¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 21 January 2025.¶
Copyright (c) 2024 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
This document defines an ontology that describes the specifications published by the RFC Editor, together with ancillary documents like errata and RFC series.¶
This effort is the continuation of the RFC-Prolog database that was described in one of the position papers presented at the IAB Workshop on Analyzing IETF Data (AID) [RFC9307]. The schema in that database was simplified and reformulated as an ontology.¶
The RFC Ontology extends the Bibliographic Ontology [BIBO] and reuse elements from the Friend of a friend [FOAF] and DCMI Metadata Terms [DCTERMS] ontologies.¶
Name | bcp |
URI | ftp://shalmaneser.org/rfc#bcp |
Type | property |
Label | BCP |
Comment | The BCP this RFC is part of. |
Inverse of | http://purl.org/dc/terms/hasPart |
Has Domain | ftp://shalmaneser.org/rfc#Rfc |
Range Includes | ftp://shalmaneser.org/rfc#Bcp |
Name | corrects |
URI | ftp://shalmaneser.org/rfc#corrects |
Type | property |
Label | Corrects |
Comment | The RFC that this errata corrects. |
Subproperty of | http://purl.org/ontology/bibo/annotates |
Has Domain | ftp://shalmaneser.org/rfc#Errata |
Range Includes | ftp://shalmaneser.org/rfc#Rfc |
Name | currentStatus |
URI | ftp://shalmaneser.org/rfc#currentStatus |
Type | property |
Label | Current RFC status |
Comment | The current status of this RFC. |
Has Domain | ftp://shalmaneser.org/rfc#Rfc |
Range Includes | ftp://shalmaneser.org/rfc#RfcStatus |
Name | errataStatus |
URI | ftp://shalmaneser.org/rfc#errataStatus |
Type | property |
Label | Errata status |
Comment | The status of an errata. |
Has Domain | ftp://shalmaneser.org/rfc#Errata |
Range Includes | ftp://shalmaneser.org/rfc#ErrataStatus |
Name | fyi |
URI | ftp://shalmaneser.org/rfc#fyi |
Type | property |
Label | FYI |
Comment | The FYI this RFC is part of. |
Inverse of | http://purl.org/dc/terms/hasPart |
Has Domain | ftp://shalmaneser.org/rfc#Rfc |
Range Includes | ftp://shalmaneser.org/rfc#Fyi |
Name | informativelyReferences |
URI | ftp://shalmaneser.org/rfc#informativelyReferences |
Type | property |
Label | Informatively References |
Comment | An informative reference in an RFC. |
Subproperty of | http://purl.org/ontology/bibo/cites |
Has Domain | ftp://shalmaneser.org/rfc#Rfc |
Name | normativelyReferences |
URI | ftp://shalmaneser.org/rfc#normativelyReferences |
Type | property |
Label | Normatively References |
Comment | A normative reference in an RFC. |
Subproperty of | http://purl.org/ontology/bibo/cites |
Has Domain | ftp://shalmaneser.org/rfc#Rfc |
Name | obsoletedBy |
URI | ftp://shalmaneser.org/rfc#obsoletedBy |
Type | property |
Label | Obsoleted By |
Comment | The RFC that obsoleted this RFC. |
Subproperty of | http://purl.org/dc/terms/isReplacedBy |
Inverse of | ftp://shalmaneser.org/rfc#obsoletes |
Has Domain | ftp://shalmaneser.org/rfc#Rfc |
Range Includes | ftp://shalmaneser.org/rfc#Rfc |
Name | obsoletes |
URI | ftp://shalmaneser.org/rfc#obsoletes |
Type | property |
Label | Obsoletes |
Comment | An RFC that this RFC obsoletes. |
Subproperty of | http://purl.org/dc/terms/replaces |
Has Domain | ftp://shalmaneser.org/rfc#Rfc |
Range Includes | ftp://shalmaneser.org/rfc#Rfc |
Name | processedBy |
URI | ftp://shalmaneser.org/rfc#processedBy |
Type | property |
Label | Processed by |
Comment | The person or organization that processed that errata. |
Has Domain | ftp://shalmaneser.org/rfc#Errata |
Range Includes | http://xmlns.com/foaf/0.1/Agent |
Name | publicationStatus |
URI | ftp://shalmaneser.org/rfc#publicationStatus |
Type | property |
Label | RFC publication status |
Comment | The status of this RFC at the time it was published. |
Has Domain | ftp://shalmaneser.org/rfc#Rfc |
Range Includes | ftp://shalmaneser.org/rfc#RfcStatus |
Name | reportedBy |
URI | ftp://shalmaneser.org/rfc#reportedBy |
Type | property |
Label | Reported by |
Comment | The person or organization that reported that errata. |
Has Domain | ftp://shalmaneser.org/rfc#Errata |
Range Includes | http://xmlns.com/foaf/0.1/Agent |
Name | std |
URI | ftp://shalmaneser.org/rfc#std |
Type | property |
Label | STD |
Comment | The STD this RFC is part of. |
Inverse of | http://purl.org/dc/terms/hasPart |
Has Domain | ftp://shalmaneser.org/rfc#Rfc |
Range Includes | ftp://shalmaneser.org/rfc#Std |
Name | stream |
URI | ftp://shalmaneser.org/rfc#stream |
Type | property |
Label | RFC stream |
Comment | The stream that approved that RFC. |
Name | type |
URI | ftp://shalmaneser.org/rfc#type |
Type | property |
Label | Errata type |
Comment | The type of the errata. |
Has Domain | ftp://shalmaneser.org/rfc#Errata |
Range Includes | ftp://shalmaneser.org/rfc#ErrataType |
Name | updatedBy |
URI | ftp://shalmaneser.org/rfc#updatedBy |
Type | property |
Label | Updated By |
Comment | An RFC that this RFC updated. |
Inverse of | ftp://shalmaneser.org/rfc#updates |
Has Domain | ftp://shalmaneser.org/rfc#Rfc |
Range Includes | ftp://shalmaneser.org/rfc#Rfc |
Name | updates |
URI | ftp://shalmaneser.org/rfc#updates |
Type | property |
Label | Updates |
Comment | An RFC that this RFC updates. |
Has Domain | ftp://shalmaneser.org/rfc#Rfc |
Range Includes | ftp://shalmaneser.org/rfc#Rfc |
Name | area |
URI | ftp://shalmaneser.org/rfc#area |
Type | datatype |
Label | IETF area |
Comment | The IETF area that produced that RFC. |
Has Domain | ftp://shalmaneser.org/rfc#Rfc |
Range Includes | http://www.w3.org/2001/XMLSchema#string |
Name | initials |
URI | ftp://shalmaneser.org/rfc#initials |
Type | datatype |
Label | Initials |
Comment | The initials of an author of an RFC. |
Has Domain | http://xmlns.com/foaf/0.1/Person |
Range Includes | http://www.w3.org/2000/01/rdf-schema#Literal |
Name | keyword |
URI | ftp://shalmaneser.org/rfc#keyword |
Type | datatype |
Label | RFC keyword |
Comment | One of the keywords of an RFC. See https://www.ietf.org/topics/keywords/. |
Has Domain | ftp://shalmaneser.org/rfc#Rfc |
Range Includes | http://www.w3.org/2001/XMLSchema#string |
Name | processedOn |
URI | ftp://shalmaneser.org/rfc#processedOn |
Type | datatype |
Label | Processed on |
Comment | The date this errata was processed. |
Subproperty of | http://purl.org/dc/terms/date |
Has Domain | ftp://shalmaneser.org/rfc#Errata |
Name | reportedOn |
URI | ftp://shalmaneser.org/rfc#reportedOn |
Type | datatype |
Label | Reported on |
Comment | The date this errata was reported. |
Subproperty of | http://purl.org/dc/terms/date |
Has Domain | ftp://shalmaneser.org/rfc#Errata |
Name | wg |
URI | ftp://shalmaneser.org/rfc#wg |
Type | datatype |
Label | IETF WG |
Comment | The IETF Working Group that produced that RFC. |
Has Domain | ftp://shalmaneser.org/rfc#Rfc |
Range Includes | http://www.w3.org/2001/XMLSchema#string |
Name | Bcp |
URI | ftp://shalmaneser.org/rfc#Bcp |
Type | class |
Label | BCP |
Comment | The Best Current Pratice (BCP) series of RFCs. |
subClassOf | http://purl.org/ontology/bibo/Series |
Name | Errata |
URI | ftp://shalmaneser.org/rfc#Errata |
Type | class |
Label | RFC errata |
Comment | An errata for an RFC, published by the RFC Editor at https://www.rfc-editor.org/errata.php. |
subClassOf | http://purl.org/ontology/bibo/Note |
Name | ErrataStatus |
URI | ftp://shalmaneser.org/rfc#ErrataStatus |
Type | class |
Label | RFC Errata Status |
Comment | The current status of an RFC errata. |
Name | ErrataType |
URI | ftp://shalmaneser.org/rfc#ErrataType |
Type | class |
Label | RFC Errata Type |
Comment | The type of errata published by the RFC Editor. |
Name | Fyi |
URI | ftp://shalmaneser.org/rfc#Fyi |
Type | class |
Label | FYI |
Comment | The For Your Information (FYI) series of RFCs. |
subClassOf | http://purl.org/ontology/bibo/Series |
Name | Internet-Draft |
URI | ftp://shalmaneser.org/rfc#Internet-Draft |
Type | class |
Label | Internet Draft |
Comment | A working document of the IETF or other groups. |
subClassOf | http://purl.org/ontology/bibo/Specification |
Name | Rfc |
URI | ftp://shalmaneser.org/rfc#Rfc |
Type | class |
Label | IETF RFC |
Comment | A document published by the RFC Editor at https://www.rfc-editor.org/. |
subClassOf | http://purl.org/ontology/bibo/Standard |
Name | RfcStatus |
URI | ftp://shalmaneser.org/rfc#RfcStatus |
Type | class |
Label | RFC Status |
Comment | The status of an RFC. |
Name | Std |
URI | ftp://shalmaneser.org/rfc#Std |
Type | class |
Label | STD |
Comment | The Standard (STD) series of RFCs. |
subClassOf | http://purl.org/ontology/bibo/Series |
Name | Stream |
URI | ftp://shalmaneser.org/rfc#Stream |
Type | class |
Label | RFC Stream |
Comment | The community, known as "stream", that originated an RFC. See https://www.rfc-editor.org/info/rfc8729. |
Name | bestCurrentPractice |
URI | ftp://shalmaneser.org/rfc#bestCurrentPractice |
Type | ftp://shalmaneser.org/rfc#RfcStatus |
Label | Best Current Practice RFC status |
Comment | An RFC that standardizes practices and the results of community deliberations. |
Name | draftStandard |
URI | ftp://shalmaneser.org/rfc#draftStandard |
Type | ftp://shalmaneser.org/rfc#RfcStatus |
Label | Draft Standard RFC status |
Comment | The status of an RFC from which at least two independent and interoperable implementations from different code bases have been developed, and for which sufficient successful operational experience has been obtained. |
Name | editorial |
URI | ftp://shalmaneser.org/rfc#editorial |
Type | ftp://shalmaneser.org/rfc#ErrataType |
Label | Editorial errata |
Comment | A spelling, grammar, punctuation, or syntax error in an RFC. See https://www.rfc-editor.org/errata-definitions/. |
Name | editorialStream |
URI | ftp://shalmaneser.org/rfc#editorialStream |
Type | ftp://shalmaneser.org/rfc#Stream |
Label | Editorial stream |
Comment | RFC approved by the editorial stream editor. |
Name | experimental |
URI | ftp://shalmaneser.org/rfc#experimental |
Type | ftp://shalmaneser.org/rfc#RfcStatus |
Label | Experimental RFC status |
Comment | An RFC that is part of some research or development effort. See https://www.rfc-editor.org/info/rfc2026. |
Name | held |
URI | ftp://shalmaneser.org/rfc#held |
Type | ftp://shalmaneser.org/rfc#ErrataStatus |
Label | Held status |
Comment | Status of an errata held for a future document update. See https://www.rfc-editor.org/errata-definitions/. |
Name | historic |
URI | ftp://shalmaneser.org/rfc#historic |
Type | ftp://shalmaneser.org/rfc#RfcStatus |
Label | Historic RFC status |
Comment | An RFC that has been superseded by a more recent specification or is for any other reason considered to be obsolete. |
Name | iabStream |
URI | ftp://shalmaneser.org/rfc#iabStream |
Type | ftp://shalmaneser.org/rfc#Stream |
Label | IAB stream |
Comment | RFC approved by the IAB. See https://www.rfc-editor.org/info/rfc4845. |
Name | ietfStream |
URI | ftp://shalmaneser.org/rfc#ietfStream |
Type | ftp://shalmaneser.org/rfc#Stream |
Label | IETF stream |
Comment | RFC approved by the IETF. See https://www.rfc-editor.org/info/rfc2026 and successors. |
Name | independentStream |
URI | ftp://shalmaneser.org/rfc#independentStream |
Type | ftp://shalmaneser.org/rfc#Stream |
Label | Independent stream |
Comment | RFC approved by the independent editor. See https://www.rfc-editor.org/info/rfc2026. |
Name | informational |
URI | ftp://shalmaneser.org/rfc#informational |
Type | ftp://shalmaneser.org/rfc#RfcStatus |
Label | Informational RFC status |
Comment | An RFC that is published for the general information of the Internet community, and does not represent an Internet community consensus or recommendation. |
Name | internetStandard |
URI | ftp://shalmaneser.org/rfc#internetStandard |
Type | ftp://shalmaneser.org/rfc#RfcStatus |
Label | Internet Standard RFC status |
Comment | An RFC for which significant implementation and successful operational experience has been obtained. |
Name | irtfStream |
URI | ftp://shalmaneser.org/rfc#irtfStream |
Type | ftp://shalmaneser.org/rfc#Stream |
Label | IRTF stream |
Comment | RFC approved by the IRTF. See https://www.rfc-editor.org/info/rfc5743. |
Name | proposedStandard |
URI | ftp://shalmaneser.org/rfc#proposedStandard |
Type | ftp://shalmaneser.org/rfc#RfcStatus |
Label | Proposed Standard RFC status |
Comment | An RFC that is generally stable, has resolved known design choices, is believed to be well-understood, has received significant community review, and appears to enjoy enough community interest to be considered valuable. |
Name | rejected |
URI | ftp://shalmaneser.org/rfc#rejected |
Type | ftp://shalmaneser.org/rfc#ErrataStatus |
Label | Rejected status |
Comment | The status of an RFC errata that has been rejected as invalid. See https://www.rfc-editor.org/errata-definitions/. |
Name | reported |
URI | ftp://shalmaneser.org/rfc#reported |
Type | ftp://shalmaneser.org/rfc#ErrataStatus |
Label | Reported status |
Comment | The initial status of an RFC errata. See https://www.rfc-editor.org/errata-definitions/. |
Name | technical |
URI | ftp://shalmaneser.org/rfc#technical |
Type | ftp://shalmaneser.org/rfc#ErrataType |
Label | Technical errata |
Comment | An error in the technical content of an RFC. See https://www.rfc-editor.org/errata-definitions/. |
Name | verified |
URI | ftp://shalmaneser.org/rfc#verified |
Type | ftp://shalmaneser.org/rfc#ErrataStatus |
Label | Verified status |
Comment | The status of an RFC errata that has been verified as being correct. See https://www.rfc-editor.org/errata-definitions/. |
No IANA considerations in this document.¶
The information in that document are derived from publicly available databases, so they do not present more security risk.¶
An implementation of the RFC ontology using the programming language Ergo [ErgoAI] is provided.¶
The "rfcs.ergo" file contains the list of all RFCs, BCPs, STDs, and FYIs.¶
The following example shows an RFC metadata encoded in Ergo:¶
\"https://www.rfc-editor.org/info/rfc9306":rfc#Rfc [ rfc#number -> 9306 , terms#title -> 'Vendor-Specific LISP Canonical Address Format (LCAF)' , terms#creator -> {\#1, \#2, \#3, \#4, \#5} , bibo#authorList -> [\#1, \#2, \#3, \#4, \#5] , rfc#date -> '2022-10' , terms#format -> {'text/html', 'text/plain', 'application/pdf', 'text/xml'} , rfc#keyword -> {'lisp', 'lcaf', 'internal', 'domain', 'organization', 'private'} , bibo#abstract -> 'This document describes a ...' , terms#isVersionOf -> \"https://datatracker.ietf.org/doc/draft-ietf-lisp-vendor-lcaf-12" , rfc#updates -> {\"https://www.rfc-editor.org/info/rfc8060":rfc#Rfc} , rfc#publicationStatus -> rfc#experimental , rfc#currentStatus -> rfc#experimental , rfc#stream -> rfc#ietf , rfc#area -> 'rtg' , rfc#wg -> 'lisp' , bibo#doi -> '10.17487/RFC9306' , rfc#normativelyReferences -> { \"https://ieeexplore.ieee.org/document/6847097" , \"https://www.rfc-editor.org/info/rfc2119" , \"https://www.rfc-editor.org/info/rfc8060" , \"https://www.rfc-editor.org/info/rfc8126" , \"https://www.rfc-editor.org/info/rfc8174" , \"https://www.rfc-editor.org/info/rfc9300" , \"https://www.rfc-editor.org/info/rfc9301" } ] , \#1:foaf#Person [ foaf#name -> 'Alberto Rodriguez-Natal' , foaf#familyName -> 'Rodriguez-Natal' , rfc#initials -> 'A.' ] , \#2:foaf#Person [ foaf#name -> 'Vina Ermagan' , foaf#familyName -> 'Ermagan' , rfc#initials -> 'V.' ] , \#3:foaf#Person [ foaf#name -> 'Anton Smirnov' , foaf#familyName -> 'Smirnov' , rfc#initials -> 'A.' ] , \#4:foaf#Person [ foaf#name -> 'Vrushali Ashtaputre' , foaf#familyName -> 'Ashtaputre' , rfc#initials -> 'V.' ] , \#5:foaf#Person [ foaf#name -> 'Dino Farinacci' , foaf#familyName -> 'Farinacci' , rfc#initials -> 'D.' ] .¶
Comments on some non-obvious encoding:¶
The following example shows a BCP encoded in Ergo:¶
\"https://www.rfc-editor.org/info/bcp0003":rfc#Bcp [ rfc#number -> 3 , bibo#hasPart -> { \"https://www.rfc-editor.org/info/rfc1915" } ].¶
STD and FYI are encoded similarly, substituting respectively "rfc#Std" and "rfc#Fyi" to "rfc#Bcp".¶
The "errata.flr" file contains the list of all Errata.¶
The following example shows an Errata encoded in Ergo:¶
\"https://www.rfc-editor.org/errata/eid5866":rfc#Errata [ rfc#id -> 5866 , rfc#corrects -> \"https://www.rfc-editor.org/info/rfc0005":rfc#Rfc , rfc#type -> rfc#editorial , rfc#status -> rfc#verified , rfc#reportedBy -> \#:foaf#Person[foaf#name -> 'Martin Thomson'] , rfc#reportedOn -> "2019-09-26"^^\date , rfc#processedBy -> \#:foaf#Person[foaf#name -> 'Benjamin Kaduk'] , rfc#processedOn -> "2019-09-26"^^\date ].¶
The git repository also contains a [Zotero] importer for the same "rfc-index.xml" file that is used to build the "rfcs.flr" file. The simplest way to install it is to create a symbolic link for the "RFC-Index.js" file in the subdirectory "translators" of the "~/.zotero" directory.¶
The examples that follow can be executed in the Ergo REPL ("runergo" or "runergo.bat").¶
The Flora-2 REPL can be either run from the local machine or from Docker:¶
docker build --build-arg uid=$(id -u) -t runergo:latest . \ && docker run --rm -it -u $(id -u):$(id -g) -v $(pwd):/ergo \ runergo¶
The files must be loaded after starting the REPL:¶
[schema,+rfcs,+errata].¶
Note that loading the files should take a minute the first time, but around one second after that. Queries should not take more than a few hundred milliseconds to run.¶
Listing all the April Fools's Day RFCS:¶
?:rfc#Rfc[rfc#number -> ?rfc, rfc#date -> ?_d], ?_d[endsWith('-04-01')]@\btp.¶
Listing all the RFCs that cites RFC 5234, normatively or informatively:¶
?_abnf:rfc#Rfc[rfc#number -> 5234], ?:rfc#Rfc[bibo#cites -> ?_abnf, rfc#number -> ?rfc, terms#title -> ?title].¶
Identify all the RFCs that are descendants of a particular RFC by traversing the set of RFC update and obsolete relationships.
Save that code in a file named "desc.ergo", then load it in the REPL with [schema,+rfcs,+desc].
.
Then descendant(<rfc-number>, ?rfc).
will return the descendants.¶
descendant(?number, ?rfc) :- ?_rfc:rfc#Rfc[rfc#number -> ?number], descendant_1(?_rfc, ?rfc). descendant_1(?x, ?z) :- ?z:rfc#Rfc[rfc#updates -> ?x]. descendant_1(?x, ?z) :- ?z:rfc#Rfc[rfc#obsoletes -> ?x]. descendant_1(?x, ?z) :- ?y:rfc#Rfc[rfc#updates -> ?x], descendant_1(?y, ?z). descendant_1(?x, ?z) :- ?y:rfc#Rfc[rfc#obsoletes -> ?x], descendant_1(?y, ?z).¶
Finding the transitive closure of normative references to an RFC, i.e., all RFCs that normatively reference that RFC or an RFC already in the list.
Save that code in a file named "tran.ergo", then load it in the REPL with [schema,+rfcs,+tran].
.
Then transitive_closure(<rfc-number>, ?rfc).
will return the transitive closure.¶
transitive_closure(?number, ?rfc) :- ?_rfc:rfc#Rfc[rfc#number -> ?number], transitive_closure_1(?_rfc, ?rfc). transitive_closure_1(?x, ?z) :- ?z:rfc#Rfc[rfc#normativelyReferences -> ?x]. transitive_closure_1(?x, ?z) :- ?y:rfc#Rfc[rfc#normativelyReferences -> ?x], transitive_closure_1(?y, ?z).¶
More examples will be provided in future versions of this draft. Suggestions are welcome.¶
The files are distributed as a git repository that can be cloned with the following command:¶
git clone git://shalmaneser.org/VejlapAknul1 rfc-ontology-ergo¶
This git repository is mirrored in various locations over the world, with the GPS coordinates in decimal degrees of all these locations stored in the DNS as a TXT resource record. The "dig +dnssec txt shalmaneser.org" command can be used to find these locations and substitute the closest subdomain in the git URL above.¶
The git repository is updated most Mondays before 23:59:59 UTC with a new commit that covers new RFCs, Errata, or changes in status. The date of the next planned update is added of the comment of each commit.¶
The "update" script that is used to update the files is distributed in the git repository, so they these files can be updated in case the current maintainer is unable to do so. The list of tools to install prior to running the script is in that script.¶
The code in that repository is licensed under an AGPL3+ license.¶
Thanks to John Levine and Robert Sparks for their help in gathering the information used for populating the knowledge graphs.¶
Thanks to Scott Hollenbeck and Carsten Bormann for the ideas for the example queries.¶
No technology that cannot explain its own results (LLM, AI/ML) have been involved in the creation of this document or its associated tooling.¶