Re: [protege-user] modeling DNS infrastructure as an ontology in Protege
Michael DeBellis <[email protected]> Fri, 6 Mar 2026 11:09:17 -0800
| Newsgroups | gmane.comp.misc.ontology.protege.owl |
|---|---|
| Message-ID | <CALGFikeEWJkEHq60kPi5deqi0H5WnK+G27Tx2-1JG172-Lm3Jg@mail.gmail.com> |
--000000000000a34cec064c5fcaee
Content-Type: multipart/related; boundary="000000000000a34ceb064c5fcaed"
--000000000000a34ceb064c5fcaed
Content-Type: multipart/alternative; boundary="000000000000a34cea064c5fcaec"
--000000000000a34cea064c5fcaec
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
Vahid, I agree with Samson and Igor. OWL 2 is definitely the way to go. I
thought your question about standard vocabularies was interesting. I've
found that there are a lot of W3C vocabularies that don't get as much
attention as things like PROV and SKOS but can be very useful:
https://www.w3.org/TR/ E.g., I'm currently working on a Data Catalog and
just to be sure I looked and to my surprise there is an excellent
vocabulary: https://www.w3.org/TR/vocab-dcat-2/ that covers the basics of
a data catalog and gave me a foundation that makes my ontology more
reusable and compatible with work done by others. So I kind of went down a
rabbit hole looking for a DNS vocabulary. I didn't find one but I had some
other thoughts along the way. As a result this is going to be a long email.
I hope you find some of it worthwhile:
1. OWL DL vs OWL Full
Use OWL DL. This is one of those rare questions where the answer isn't "it
depend on your use cases but most people..." No. This is black and white
there is a right answer and wrong answer and the right answer is use OWL
DL. OWL Full is rarely needed and sacrifices decidable reasoning. Your
domain (DNS record types, domains, nameservers, etc.) fits comfortably in
OWL DL. For example:
Domain
DNS_Record
subclasses such as A_Record, MX_Record, TXT_Record
properties like has_dns_record, points_to_ip, has_priority
OWL is good for modeling structural relationships and classification, but
it=E2=80=99s not ideal for enforcing operational constraints because of the=
Open
World Assumption.
For auditing rules such as:
=E2=80=9Cevery domain must have at least one NS record=E2=80=9D
=E2=80=9CMX records must point to hosts with A/AAAA records=E2=80=9D
=E2=80=9CSPF TXT records must follow a pattern=E2=80=9D
you=E2=80=99ll usually want SHACL shapes to validate the graph.
Example idea (simplified):
ex:DomainShape a sh:NodeShape ; sh:targetClass ex:Domain ; sh:property [
sh:path ex:has_dns_record ; sh:class ex:NS_Record ; sh:minCount 1 ; ] .
SHACL works very well alongside OWL: OWL for model semantics, SHACL for
data validation.
IMO we should rename OWL Full to "OWL Why Are You using a Profile that
negates using a Reasoner?" There is almost no use case I can think of where
it makes sense to use OWL Full and the name kind of makes it sound like it
is the profile you use when you want maximum knowledge representation but
in reality that profile is OWL DL.
1.1 OWL vs Property Graphs. One other question you may get asked is: Why
use OWL rather than Property Graphs, especially Neo4j? This is a reasonable
question. I'm going to use Neo4j as a representative of property graphs in
general.
The Neo4j model has the advantage that you can model attributes on
properties. E.g., if you have a property called has_employer when you
create a property value that in RDF (the graph language that OWL is built
on) and OWL would be:
:VonNeumann :has_employer :Institute_For_Advanced_Study
In Neo4j you have a specific object that models this connection. You
effectively (over simplifying a bit) have an instance of :has_employer just
for the relation between :VonNeumann and :Institute_For_Advanced_Study. So
if you want to add :hiring_date to that edge in the graph to record when
Von Neuman started working at the Institute you can. In RDF and hence OWL
you can't do that (btw, that is why there is work on RDFStar). So for some
models that are highly graph based (like DNS) this can be valuable.
However, there is a very common pattern called n-ary relation that gives
you the same capabilities (actually more than prop graphs) by reifying the
relation:
https://www.w3.org/2001/sw/BestPractices/OEP/n-aryRelations-20040623/ I.e.,
you have a class called Employment and when you create a value, you create
a new instance of Employment that in this example would model the
employment relation with VonNeumann and IBM. So you have the same
capability as a property graph.
Neo4j has some advantages in speed... although honestly, I'm not sure how
much better it is, to my knowledge there are no truly independent
evaluations and if you are a property graph vendor you can easily skew an
example to make property graphs look much more efficient and if you are an
OWL triplestore vendor you can do the same for OWL and RDF graphs. But for
explicit knowledge representation (which I think is what you want) I think
virtually everyone would agree OWL is better.
2. Existing ontologies
Kind of to my surprise, I couldn't find a widely adopted ontology
specifically for DNS infrastructure.
Trying to extend a heavyweight upper ontology often adds complexity without
much benefit for infrastructure modeling. This is just my opinion and
others will disagree but I would recommend you avoid using
philosophical upper models like DOLCE or BFO. They add a bunch of jargon to
your ontology that makes it far more difficult for anyone not familiar with
the jargon to immediately grasp the fundamental ideas. Again, this is my
personal opinion but I've been building models with end users since the
1980's and I find that what makes OWL a fantastic domain modeling tool is
that with just a brief bit of background, most end users can look at an OWL
model in Protege and quickly understand the basic ideas. But when they open
an ontology and the first clases they see are continuant and occurrent they
immediately feel lost and feel like the ontology is an artifact for the
experts which in my experience is exactly the opposite of what you want.
One thing I strongly recommend for your starting model is to reuse common
metadata properties. Most of those are in Dublin Core (note you want the DC
Terms entities that start with: http://purl.org/dc/terms not the older DC
entities that start with: http://purl.org/dc/elements/1.1/, you will find
all the properties in dcterms are in dc but dc is for legacy systems and
dcterms has many more entities that are useful). Also, I recommend you use
a few entities from SKOS such as skos:altLabel and skos:prefLabel. Also, I
really like the Simplified Upper Level Ontology (SULO):
https://github.com/AIDAVA-DEV/sulo To me that is a perfect Upper Model. It
is very focused on just those few classes and properties that aren't in any
of the standard ontologies. One thing I especially like about SULO is it
really fits right in with PROV.
Another model you might want to check out as a light upper model is
Schema.org. I haven't used that much but it has a lot of backing from big
companies and it focuses on modeling online sites so might be useful.
You might want to look at Gist from Cambridge Semantics. It depends on the
focus of your work. If you are only modeling DNS and not also things like
organizations, places, services, people, contracts, etc. then you probably
don't want Gist. If you are also modeling a more expansive domain where you
include general business objects than Gist might make sense and they have
classes for basic graph modeling. I would recommend that if you need the
more expansive concepts you go with Gist and go with their network classes
and properties. But if you don't need those more expansive classes I
wouldn't recommend using Gist just for its graph and network classes. Those
are really straight forward and also not the main focus of Gist. BTW, when
I use Gist, I typically remove some of the classes or axioms that aren't
relevant to my domains and slow down the reasoner.
Finally, regarding light weight upper models, you might want to check out
something I put together:
https://github.com/mdebellis/Basic_Reusable_Ontology I created these at
first for my own use but thought that others might find them useful as
well, although you could easily redo what I did by just loading and pruning
a few vocabularies. I found that every time I created a new ontology I was
always importing certain annotation properties from dcterms, and SKOS as
well as classes and properties from PROV and SULO. There are 3 vocabs
there: Basic Bro (just properties from DCTM and a few from SKOS), Big Bro
(all of Basic Bro plus some classes and properties from PROV and all of
SULO) and Bro Pro (all of Big Bro plus all of PROV). Note there are no new
entities in any of these ontologies, it is just a collection of entities
from other vocabularies I've found are most useful.
If you don't understand things like the OWA, the relation between OWL with
RDF SHACL and SPARQL, you might find my revised Pizza tutorial useful:
https://www.michaeldebellis.com/post/new-protege-pizza-tutorial
3. Modeling DNS hierarchy
In OWL the standard way you model a sub-part hierarchy is divided between
the TBox (OWL jargon for the schema level, definition of classes,
properties, etc.) and the ABox (OWL jargon for the instance level, what
would be rows in a table, instances in an OOP system). At the TBox level
you would typically model that as axioms on the classes that define the
hierarchy. This is just for an example so this isn't legit DL:
Computer: has_sub_component some computer_component
Computer_Component: is_component_of some computer_component or
has_component some computer_component
I.e., a Computer has_components like Mother_Board and Monitor. And all
computer components must have at least one super-component (is_component_of
some computer_component) or they must have sub-components: has_component
some computer_component This is an "or" because the leaf components have no
sub-components and the root component has no super component). That's how
you do it at the TBox level. At the ABox level, you have instances of each
class and you create property values that connect super components to sub
components. There is a plugin called Individual Property Hierarchy that is
very useful and I recommend you install. Here is what this simple example
looks like using that plugin:
[image: image.png]
I.e., we create an instance of each class. PC1 is an instance of Computer.
Keyboard1 and Motherboard1 are instances of Computer_Components. So PC1 had
a value for the object property has_component that is Motherboard1 (and
another two values for Keyboard1 and Monitor1) and
Motherboard1 has_component Bus1, Motherboard1 has_component CPU1,...
BTW, I realize that this is a very different kind of hierarchy than what
you are modeling, the point is that many types of properties that define a
hierarchy (whether that hierarchy is a physical or conceptual one) can be
modeled this way.
One more useful feature: you can create a super property for has_component
(or whatever you decide to call your hierarchical property) that is often
called: has_component_transitive. E.g., in this example you can see I have
has_component_transitive. I don't graph that one because it gets the
transitive closure for a component and all its sub components and that
obscures which are direct sub-components and which are components of
sub-components. E.g. for Computer1 it has_component_transitive: Keyboard1,
Monitor1, Motherboard1, Bus1, CPU1, RAM1.
(BTW, I realize this is just a toy computer model, it is just something I
use to explain the concepts).
4. Querying and auditing
Your auditing workflow will likely combine:
SPARQL for checks (missing records, inconsistent configurations)
SHACL for structural validation
OWL reasoning for classification and inferred relationships
In short: Prot=C3=A9g=C3=A9 + OWL for the model, SHACL + SPARQL for auditin=
g rules is
a common and practical architecture for this kind of system.
OWL uses the Open World Assumption. This makes it excellent for reasoning
about the Internet (which is why OWA was chosen) but also can be quite
useful for modeling enterprise data where you are combining metadata from
many systems that were originally designed to be independent (and the same
will probably apply to aspects of the DSN model). But the consequences of
the OWA are if you have a constraint such as "All components must have
either a sub-component or a super-component" you will never get notified if
this is not true because the OWA doesn't assume all relevant information is
in the knowledge graph (or whatever way you store data for the ontology,
usually a graph database is used). This is why SHACL was invented. The best
practice now is to define your domain in OWL and data integrity constraints
in SHACL.
One more thing: depending on your requirements you probably will eventually
need a way to interact with your OWL and SHACL with a programming language.
E.g., if you want a user interface, need to upload data, integrate with
existing systems, etc. There are two ways to do this:
1) Use a library. This is probably what you want. If you work in Python you
can use RDFLib or OWLReady2. Both are free. I stick to RDFLib. It doesn't
do as much as OWLReady2 but it is a bit more stable... although I really
haven't used OWLReady2 so shouldn't say much about it. Based on
recommendations from some of my colleagues I use RDFLib and so far it does
everything I want. If you want to see an example RDFLib code, here is a
Python function I wrote recently using RDFLib. It generates what I call
embedding_note values. The use case is when you use OWL for graph RAG, the
actual knowledge in the graph isn't available to the LLM. This function is
a quick and dirty (and surprisingly effective so far) way to generate
strings that summarize info in the graph in a way that can also be
recognized by the LLM:
https://github.com/mdebellis/data_catalog_knowledge_graph/blob/main/src/add=
_embedding_notes_from_properties.py
That function shows how you read, parse, and output a Turtle file which is
one format to save an OWL ontology.
2) Use a triplestore graph DB. For research purposes, the commercial
triplestore graph vendors are surprisingly open to using their tools. They
all have a "community version" which you can't use for any for profit uses
but for research the restrictions are quite reasonable and you can do a lot
while staying within their boundaries. Doing this gives you access to all
kinds of additional libraries and tools. E.g., the tools to draw arbitrary
graphs are much more powerful and usable than the graphing tools in
Protege.
Here is an example of building a simple user interface for a graph RAG
system developed with AllegroGraph:
https://github.com/mdebellis/Climate_Obstruction/blob/main/src/ui_md_v2.py
If you do use AllegroGraph you might also find the following useful. What
this does is encapsulate the most common interactions with AllegroGraph in
higher level Python functions. If you look at that UI file it has almost
nothing specific to AllegroGraph, that is because it uses this api file.
The idea is eventually I can make other libraries with the same function
signatures so that it is very easy to use different graph databases:
https://github.com/mdebellis/Climate_Obstruction/blob/main/src/ag_api.py
Finally, I used ChatGPT to check some of the things I said above and in the
process it volunteered to generate a draft of an OWL model for DNS. Below
is what it came up with. Also, sometimes when you copy/paste from text into
a file you can get random bits of noise that the Protege parser doesn't
like so I extracted the following (minus the SHACL) to a file that I knew
would parse with Protege and that file is attached.
Michael
https://www.michaeldebellis.com/blog
@prefix ex: <https://example.org/dns#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix sh: <http://www.w3.org/ns/shacl#> .
#################################################################
# Ontology
#################################################################
ex: a owl:Ontology ;
rdfs:label "DNS Infrastructure Ontology"@en ;
rdfs:comment "A starter ontology for modeling domains, zones,
nameservers, registrars, providers, and DNS resource records."@en .
#################################################################
# Core classes
#################################################################
ex:Domain a owl:Class ;
rdfs:label "Domain"@en .
ex:Zone a owl:Class ;
rdfs:label "Zone"@en .
ex:DNS_Record a owl:Class ;
rdfs:label "DNS record"@en .
ex:A_Record a owl:Class ;
rdfs:subClassOf ex:DNS_Record ;
rdfs:label "A record"@en .
ex:AAAA_Record a owl:Class ;
rdfs:subClassOf ex:DNS_Record ;
rdfs:label "AAAA record"@en .
ex:CNAME_Record a owl:Class ;
rdfs:subClassOf ex:DNS_Record ;
rdfs:label "CNAME record"@en .
ex:MX_Record a owl:Class ;
rdfs:subClassOf ex:DNS_Record ;
rdfs:label "MX record"@en .
ex:NS_Record a owl:Class ;
rdfs:subClassOf ex:DNS_Record ;
rdfs:label "NS record"@en .
ex:TXT_Record a owl:Class ;
rdfs:subClassOf ex:DNS_Record ;
rdfs:label "TXT record"@en .
ex:SOA_Record a owl:Class ;
rdfs:subClassOf ex:DNS_Record ;
rdfs:label "SOA record"@en .
ex:PTR_Record a owl:Class ;
rdfs:subClassOf ex:DNS_Record ;
rdfs:label "PTR record"@en .
ex:IPAddress a owl:Class ;
rdfs:label "IP address"@en .
ex:IPv4_Address a owl:Class ;
rdfs:subClassOf ex:IPAddress ;
rdfs:label "IPv4 address"@en .
ex:IPv6_Address a owl:Class ;
rdfs:subClassOf ex:IPAddress ;
rdfs:label "IPv6 address"@en .
ex:Host a owl:Class ;
rdfs:label "Host"@en .
ex:Mail_Server a owl:Class ;
rdfs:subClassOf ex:Host ;
rdfs:label "Mail server"@en .
ex:Name_Server a owl:Class ;
rdfs:subClassOf ex:Host ;
rdfs:label "Name server"@en .
ex:Registrar a owl:Class ;
rdfs:label "Registrar"@en .
ex:Hosting_Provider a owl:Class ;
rdfs:label "Hosting provider"@en .
ex:DNS_Provider a owl:Class ;
rdfs:label "DNS provider"@en .
ex:Policy_Text a owl:Class ;
rdfs:label "Policy text"@en .
#################################################################
# Object properties
#################################################################
ex:has_zone a owl:ObjectProperty ;
rdfs:domain ex:Domain ;
rdfs:range ex:Zone ;
rdfs:label "has zone"@en .
ex:has_dns_record a owl:ObjectProperty ;
rdfs:domain ex:Domain ;
rdfs:range ex:DNS_Record ;
rdfs:label "has DNS record"@en .
ex:in_zone a owl:ObjectProperty ;
rdfs:domain ex:DNS_Record ;
rdfs:range ex:Zone ;
rdfs:label "in zone"@en .
ex:for_domain a owl:ObjectProperty ;
rdfs:domain ex:DNS_Record ;
rdfs:range ex:Domain ;
rdfs:label "for domain"@en .
ex:points_to_ip a owl:ObjectProperty ;
rdfs:domain ex:A_Record ;
rdfs:range ex:IPv4_Address ;
rdfs:label "points to IPv4 address"@en .
ex:points_to_ipv6 a owl:ObjectProperty ;
rdfs:domain ex:AAAA_Record ;
rdfs:range ex:IPv6_Address ;
rdfs:label "points to IPv6 address"@en .
ex:alias_for a owl:ObjectProperty ;
rdfs:domain ex:CNAME_Record ;
rdfs:range ex:Domain ;
rdfs:label "alias for"@en .
ex:mail_exchanger a owl:ObjectProperty ;
rdfs:domain ex:MX_Record ;
rdfs:range ex:Mail_Server ;
rdfs:label "mail exchanger"@en .
ex:authoritative_nameserver a owl:ObjectProperty ;
rdfs:domain ex:NS_Record ;
rdfs:range ex:Name_Server ;
rdfs:label "authoritative nameserver"@en .
ex:reverse_maps_to a owl:ObjectProperty ;
rdfs:domain ex:PTR_Record ;
rdfs:range ex:Domain ;
rdfs:label "reverse maps to"@en .
ex:registered_with a owl:ObjectProperty ;
rdfs:domain ex:Domain ;
rdfs:range ex:Registrar ;
rdfs:label "registered with"@en .
ex:hosted_by a owl:ObjectProperty ;
rdfs:domain ex:Domain ;
rdfs:range ex:Hosting_Provider ;
rdfs:label "hosted by"@en .
ex:dns_served_by a owl:ObjectProperty ;
rdfs:domain ex:Domain ;
rdfs:range ex:DNS_Provider ;
rdfs:label "DNS served by"@en .
ex:has_subdomain a owl:ObjectProperty , owl:TransitiveProperty ;
rdfs:domain ex:Domain ;
rdfs:range ex:Domain ;
rdfs:label "has subdomain"@en .
ex:subdomain_of a owl:ObjectProperty , owl:TransitiveProperty ;
owl:inverseOf ex:has_subdomain ;
rdfs:domain ex:Domain ;
rdfs:range ex:Domain ;
rdfs:label "subdomain of"@en .
#################################################################
# Data properties
#################################################################
ex:fqdn a owl:DatatypeProperty ;
rdfs:domain ex:Domain ;
rdfs:range xsd:string ;
rdfs:label "fully qualified domain name"@en .
ex:record_name a owl:DatatypeProperty ;
rdfs:domain ex:DNS_Record ;
rdfs:range xsd:string ;
rdfs:label "record name"@en .
ex:ttl_seconds a owl:DatatypeProperty ;
rdfs:domain ex:DNS_Record ;
rdfs:range xsd:integer ;
rdfs:label "TTL seconds"@en .
ex:preference a owl:DatatypeProperty ;
rdfs:domain ex:MX_Record ;
rdfs:range xsd:integer ;
rdfs:label "MX preference"@en .
ex:text_value a owl:DatatypeProperty ;
rdfs:domain ex:TXT_Record ;
rdfs:range xsd:string ;
rdfs:label "text value"@en .
ex:soa_serial a owl:DatatypeProperty ;
rdfs:domain ex:SOA_Record ;
rdfs:range xsd:integer ;
rdfs:label "SOA serial"@en .
ex:address_value a owl:DatatypeProperty ;
rdfs:domain ex:IPAddress ;
rdfs:range xsd:string ;
rdfs:label "address value"@en .
#################################################################
# Useful OWL restrictions
#################################################################
ex:A_Record rdfs:subClassOf [
a owl:Restriction ;
owl:onProperty ex:points_to_ip ;
owl:someValuesFrom ex:IPv4_Address
] .
ex:AAAA_Record rdfs:subClassOf [
a owl:Restriction ;
owl:onProperty ex:points_to_ipv6 ;
owl:someValuesFrom ex:IPv6_Address
] .
ex:MX_Record rdfs:subClassOf [
a owl:Restriction ;
owl:onProperty ex:mail_exchanger ;
owl:someValuesFrom ex:Mail_Server
] .
ex:NS_Record rdfs:subClassOf [
a owl:Restriction ;
owl:onProperty ex:authoritative_nameserver ;
owl:someValuesFrom ex:Name_Server
] .
#################################################################
# Example individuals
#################################################################
ex:example_com a ex:Domain ;
ex:fqdn "example.com" ;
ex:registered_with ex:Example_Registrar ;
ex:dns_served_by ex:Example_DNS_Provider ;
ex:hosted_by ex:Example_Hosting ;
ex:has_subdomain ex:www_example_com .
ex:www_example_com a ex:Domain ;
ex:fqdn "www.example.com" ;
ex:subdomain_of ex:example_com .
ex:Example_Registrar a ex:Registrar ;
rdfs:label "Example Registrar"@en .
ex:Example_DNS_Provider a ex:DNS_Provider ;
rdfs:label "Example DNS Provider"@en .
ex:Example_Hosting a ex:Hosting_Provider ;
rdfs:label "Example Hosting Provider"@en .
ex:ns1_example a ex:Name_Server ;
rdfs:label "ns1.example.net"@en .
ex:mx1_example a ex:Mail_Server ;
rdfs:label "mx1.example.net"@en .
ex:ip1 a ex:IPv4_Address ;
ex:address_value "192.0.2.10" .
ex:ipv6_1 a ex:IPv6_Address ;
ex:address_value "2001:db8::10" .
ex:a_record_1 a ex:A_Record ;
ex:for_domain ex:example_com ;
ex:record_name "example.com" ;
ex:ttl_seconds 3600 ;
ex:points_to_ip ex:ip1 .
ex:aaaa_record_1 a ex:AAAA_Record ;
ex:for_domain ex:example_com ;
ex:record_name "example.com" ;
ex:ttl_seconds 3600 ;
ex:points_to_ipv6 ex:ipv6_1 .
ex:mx_record_1 a ex:MX_Record ;
ex:for_domain ex:example_com ;
ex:record_name "example.com" ;
ex:preference 10 ;
ex:mail_exchanger ex:mx1_example .
ex:ns_record_1 a ex:NS_Record ;
ex:for_domain ex:example_com ;
ex:record_name "example.com" ;
ex:authoritative_nameserver ex:ns1_example .
ex:txt_record_1 a ex:TXT_Record ;
ex:for_domain ex:example_com ;
ex:record_name "example.com" ;
ex:text_value "v=3Dspf1 include:_spf.example.net ~all" .
#################################################################
# Minimal SHACL examples
#################################################################
ex:DomainShape a sh:NodeShape ;
sh:targetClass ex:Domain ;
sh:property [
sh:path ex:has_dns_record ;
sh:minCount 1 ;
] .
ex:MXRecordShape a sh:NodeShape ;
sh:targetClass ex:MX_Record ;
sh:property [
sh:path ex:preference ;
sh:datatype xsd:integer ;
sh:minCount 1 ;
sh:maxCount 1 ;
] ;
sh:property [
sh:path ex:mail_exchanger ;
sh:class ex:Mail_Server ;
sh:minCount 1 ;
] .
On Thu, Mar 5, 2026 at 4:24=E2=80=AFAM Vahid Shaik <[email protected]> wro=
te:
> Hi,
>
> I'm exploring whether Protege is the right tool for modeling DNS
> infrastructure as an ontology. The idea is to represent the relationships
> between DNS record types (A, AAAA, CNAME, MX, NS, TXT, SOA, PTR), domains=
,
> nameservers, registrars, and hosting providers as a structured knowledge
> graph.
>
> For example:
> - A domain has DNS records (A, AAAA, CNAME, MX, NS, TXT)
> - An A record points to an IPv4 address
> - MX records point to mail servers with priority values
> - TXT records contain SPF, DKIM, and DMARC policies
> - A domain is registered with a registrar
> - Nameservers are authoritative for specific domains
>
> The goal is to build something that could help with automated DNS auditin=
g
> =E2=80=94 given a domain, traverse the ontology to check if all expected =
records
> exist and are consistent.
>
> I've been gathering real-world DNS data using
> https://dnsrobot.net/dns-lookup to understand the typical relationships
> between record types for different domain configurations (e.g., domains o=
n
> Cloudflare vs AWS Route 53 have very different NS and CNAME patterns).
>
> Has anyone built a similar network infrastructure ontology in Protege? I'=
m
> wondering:
>
> 1. Should I use OWL DL or OWL Full for this kind of model?
> 2. Is there an existing upper ontology that covers network/internet
> infrastructure I could extend?
> 3. Any tips on modeling the hierarchical nature of DNS (root =E2=86=92 TL=
D =E2=86=92 SLD =E2=86=92
> subdomain)?
>
> Thanks
> _______________________________________________
> protege-user mailing list
> [email protected]
> https://mailman.stanford.edu/mailman/listinfo/protege-user
>
--000000000000a34cea064c5fcaec
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">Vahid, I agree with Samson and Igor. OWL 2 is definitely t=
he way to go. I thought your question about standard vocabularies was inter=
esting. I've found that there are a lot of W3C vocabularies that don=
9;t get as much attention as things like PROV and SKOS but can be very usef=
ul:=C2=A0<a href=3D"https://www.w3.org/TR/">https://www.w3.org/TR/</a>=C2=
=A0 E.g., I'm currently working on a Data Catalog and just to be sure I=
looked and to my surprise there is an excellent vocabulary:=C2=A0<a href=
=3D"https://www.w3.org/TR/vocab-dcat-2/">https://www.w3.org/TR/vocab-dcat-2=
/</a>=C2=A0 that covers the basics of a data catalog and gave me a foundati=
on that makes my ontology more reusable and compatible with work done by ot=
hers. So I kind of went down a rabbit hole looking for a DNS vocabulary. I =
didn't find one but I had some other thoughts along the way. As a resul=
t this is going to be a long email. I hope you find some of it worthwhile:=
=C2=A0<div><p>1. OWL DL vs OWL Full</p>
<p>Use OWL DL. This is one of those rare questions where the answer isn'=
;t "it depend on your use cases but most people..." No. This is b=
lack and white there is a right answer and wrong answer and the right answe=
r is use OWL DL. OWL Full is rarely needed and sacrifices decidable reasoni=
ng. Your domain (DNS record types, domains, nameservers, etc.) fits comfort=
ably in OWL DL. For example:</p>
<p>Domain</p>
<p>DNS_Record</p>
<p>subclasses such as A_Record, MX_Record, TXT_Record</p>
<p>properties like has_dns_record, points_to_ip, has_priority</p>
<p>OWL is good for modeling structural relationships and classification, bu=
t it=E2=80=99s not ideal for enforcing operational constraints because of t=
he Open World Assumption.</p>
<p>For auditing rules such as:</p>
<p>=E2=80=9Cevery domain must have at least one NS record=E2=80=9D</p>
<p>=E2=80=9CMX records must point to hosts with A/AAAA records=E2=80=9D</p>
<p>=E2=80=9CSPF TXT records must follow a pattern=E2=80=9D</p>
<p>you=E2=80=99ll usually want SHACL shapes to validate the graph.</p>
<p>Example idea (simplified):</p>
<p>ex:DomainShape
a sh:NodeShape ;
sh:targetClass ex:Domain ;
sh:property [
sh:path ex:has_dns_record ;
sh:class ex:NS_Record ;
sh:minCount 1 ;
] .
SHACL works very well alongside OWL:
OWL for model semantics, SHACL for data validation.</p><p>IMO we should ren=
ame OWL Full to "OWL Why Are You using a Profile that negates using a =
Reasoner?" There is almost no use case I can think of where it makes s=
ense to use OWL Full and the name kind of makes it sound like it is the pro=
file you use when you want maximum knowledge representation but in reality =
that profile is OWL DL.=C2=A0</p><p>1.1 OWL vs Property Graphs. One other q=
uestion you may get asked is: Why use OWL rather than Property Graphs, espe=
cially Neo4j? This is a reasonable question. I'm going to use Neo4j as =
a representative of property graphs in general.=C2=A0</p><p>The Neo4j model=
has the advantage that you can model attributes on properties. E.g., if yo=
u have a property called has_employer when you create a property value that=
in RDF (the graph language that OWL is built on) and OWL would be:=C2=A0</=
p><p>:VonNeumann=C2=A0:has_employer :Institute_For_Advanced_Study</p><p>In =
Neo4j you have a specific object that models this connection. You effective=
ly (over simplifying a bit) have an instance of :has_employer just for the =
relation between :VonNeumann=C2=A0and :Institute_For_Advanced_Study. So if =
you want to add :hiring_date to that edge in the graph to record when Von N=
euman=C2=A0started working at the Institute you can. In RDF and hence OWL y=
ou can't do that (btw, that is why there is work on RDFStar). So for so=
me models that are highly graph based (like DNS) this can be valuable. Howe=
ver, there is a very common pattern called n-ary relation that gives you th=
e same capabilities (actually more than prop graphs) by reifying the relati=
on: <a href=3D"https://www.w3.org/2001/sw/BestPractices/OEP/n-aryRelations-=
20040623/">https://www.w3.org/2001/sw/BestPractices/OEP/n-aryRelations-2004=
0623/</a> I.e., you have a class called Employment and when you create a va=
lue, you create a new instance of Employment that in this example would mod=
el the employment relation with VonNeumann=C2=A0and IBM. So you have the sa=
me capability as a property graph.</p><p>Neo4j has some advantages in speed=
... although honestly, I'm not sure how much better it is, to my knowle=
dge there are no truly independent evaluations and if you are a property gr=
aph vendor you can easily skew an example to make property graphs look much=
more efficient and if you are an OWL triplestore vendor you can do the sam=
e for OWL and RDF graphs. But for explicit knowledge representation (which =
I think is what you want) I think virtually everyone would agree OWL is bet=
ter.=C2=A0</p><p>2. Existing ontologies</p>
<p>Kind of to my surprise, I couldn't find a widely adopted ontology sp=
ecifically for DNS infrastructure.=C2=A0</p>
<p>Trying to extend a heavyweight upper ontology often adds complexity with=
out much benefit for infrastructure modeling. This is just my opinion and o=
thers will disagree but I would recommend you avoid using philosophical=C2=
=A0upper models like DOLCE or BFO. They add a bunch of jargon to your ontol=
ogy that makes it far more difficult for anyone not familiar with the jargo=
n to immediately grasp the fundamental ideas. Again, this is my personal op=
inion but I've been building models with end users since the 1980's=
and I find that what makes OWL a fantastic domain modeling tool is that wi=
th just a brief bit of background, most end users can look at an OWL model =
in Protege and quickly understand the basic ideas. But when they open an on=
tology and the first clases they see are continuant and occurrent they imme=
diately feel lost and feel like the ontology is an artifact for the experts=
which in my experience is exactly the opposite of what you want.</p><p>One=
thing I strongly recommend for your starting model is to reuse common meta=
data properties. Most of those are in Dublin Core (note you want the DC Ter=
ms entities that start with:=C2=A0<a href=3D"http://purl.org/dc/terms">http=
://purl.org/dc/terms</a> not the older DC entities that start with:=C2=A0<a=
href=3D"http://purl.org/dc/elements/1.1/">http://purl.org/dc/elements/1.1/=
</a>, you will find all the properties in dcterms are in dc but dc is for l=
egacy systems and dcterms has many more entities that are useful). Also, I =
recommend you use a few entities from SKOS such as skos:altLabel and skos:p=
refLabel. Also, I really like the Simplified Upper Level Ontology (SULO):=
=C2=A0<a href=3D"https://github.com/AIDAVA-DEV/sulo">https://github.com/AID=
AVA-DEV/sulo</a> To me that is a perfect Upper Model. It is very focused on=
just those few classes and properties that aren't in any of the standa=
rd ontologies. One thing I especially like about SULO is it really fits rig=
ht in with PROV.=C2=A0</p><p>Another model you might want to check out as a=
light upper model is Schema.org.=C2=A0 I haven't used that much but it=
has a lot of backing from big companies and it focuses on modeling online =
sites so might be useful.=C2=A0</p><p>You might want to look at Gist from C=
ambridge Semantics. It depends on the focus of your work. If you are only m=
odeling DNS and not also things like organizations, places, services, peopl=
e, contracts, etc. then you probably don't want Gist. If you are also m=
odeling a more expansive domain where you include general business objects =
than Gist might make sense and they have classes for basic graph modeling. =
I would recommend that if you need the more expansive concepts you go with =
Gist and go with their network classes and properties. But if you don't=
need those more expansive classes I wouldn't recommend using Gist just=
for its graph and network classes. Those are really straight forward and a=
lso not the main focus of Gist. BTW, when I use Gist, I typically remove so=
me of the classes or axioms that aren't relevant to my domains and slow=
down the reasoner.=C2=A0</p><p>Finally, regarding light weight upper model=
s, you might want to check out something I put together:=C2=A0<a href=3D"ht=
tps://github.com/mdebellis/Basic_Reusable_Ontology">https://github.com/mdeb=
ellis/Basic_Reusable_Ontology</a>=C2=A0 I created these at first for my own=
use but thought that others might find them useful as well, although you c=
ould easily redo what I did by just loading and pruning a few vocabularies.=
I found that every time I created a new ontology I was always importing ce=
rtain annotation properties from dcterms, and SKOS as well as classes and p=
roperties from PROV and SULO. There are 3 vocabs there: Basic Bro (just pro=
perties from DCTM and a few from SKOS), Big Bro (all of Basic Bro plus some=
classes and properties from PROV and all of SULO) and Bro Pro (all of Big =
Bro plus all of PROV). Note there are no new entities in any of these ontol=
ogies, it is just a collection of entities from other vocabularies I've=
found are most useful.=C2=A0</p><p>If you don't understand things like=
the OWA, the relation between OWL with RDF SHACL and SPARQL, you might fin=
d my revised Pizza tutorial useful:=C2=A0<a href=3D"https://www.michaeldebe=
llis.com/post/new-protege-pizza-tutorial">https://www.michaeldebellis.com/p=
ost/new-protege-pizza-tutorial</a>=C2=A0</p><p>3. Modeling DNS hierarchy</p=
>
<p>In OWL the standard way you model a sub-part hierarchy is divided betwee=
n the TBox (OWL jargon for the schema level, definition of classes, propert=
ies, etc.) and the ABox (OWL jargon for the instance level, what would be r=
ows in a table, instances in an OOP system). At the TBox level you would ty=
pically model that as axioms on the classes that define the hierarchy. This=
is just for an example so this isn't legit DL:</p><p>Computer: has_sub=
_component some computer_component=C2=A0</p><p>Computer_Component: is_compo=
nent_of some computer_component or has_component some computer_component=C2=
=A0</p><p>I.e., a Computer has_components like Mother_Board and Monitor. An=
d all computer components must have at least one super-component (is_compon=
ent_of some computer_component) or they must have sub-components: has_compo=
nent some computer_component This is an "or" because the leaf com=
ponents have no sub-components and the root component has no super componen=
t). That's how you do it at the TBox level. At the ABox level, you have=
instances of each class and you create property values that connect super =
components to sub components. There is a plugin called Individual Property =
Hierarchy that is very useful and I recommend you install. Here is what thi=
s simple example looks like using that plugin:<br><br></p><img src=3D"cid:i=
i_mmf6lpzp0" alt=3D"image.png" width=3D"442" height=3D"367"><p>I.e., we cre=
ate an instance of each class. PC1 is an instance of Computer. Keyboard1 an=
d Motherboard1=C2=A0are instances of Computer_Components. So PC1 had a valu=
e for the object property has_component that is Motherboard1=C2=A0(and anot=
her two values for Keyboard1 and Monitor1) and=C2=A0
Motherboard1=C2=A0has_component Bus1,=C2=A0
Motherboard1=C2=A0has_component CPU1,...</p><p>BTW, I realize that this is =
a very different kind of hierarchy than what you are modeling, the point is=
that many types of properties that define a hierarchy (whether that hierar=
chy is a physical or conceptual one) can be modeled this way.=C2=A0</p><p>O=
ne more useful feature: you can create a super property for has_component (=
or whatever you decide to call your hierarchical property) that is often ca=
lled: has_component_transitive. E.g., in this example you can see I have ha=
s_component_transitive. I don't graph that one because it gets the tran=
sitive closure for a component and all its sub components and that obscures=
which are direct sub-components and which are components of sub-components=
. E.g. for Computer1 it has_component_transitive: Keyboard1, Monitor1, Moth=
erboard1, Bus1, CPU1, RAM1.=C2=A0</p><p>(BTW, I realize this is just a toy =
computer model, it is just something I use to explain the concepts).=C2=A0<=
/p><p>4. Querying and auditing</p>
<p>Your auditing workflow will likely combine:</p>
<p>SPARQL for checks (missing records, inconsistent configurations)</p>
<p>SHACL for structural validation</p>
<p>OWL reasoning for classification and inferred relationships</p>
<p>In short: Prot=C3=A9g=C3=A9 + OWL for the model, SHACL + SPARQL for audi=
ting rules is a common and practical architecture for this kind of system.<=
/p><p>OWL uses the Open World Assumption. This makes it excellent for reaso=
ning about the Internet (which is why OWA was chosen) but also can be quite=
useful for modeling enterprise data where you are combining metadata from =
many systems that were originally designed to be independent (and the same =
will probably apply to aspects of the DSN model). But the consequences of t=
he OWA are if you have a constraint such as "All components must have =
either a sub-component or a super-component" you will never get notifi=
ed if this is not true because the OWA doesn't assume all relevant info=
rmation is in the knowledge graph (or whatever way you store data for the o=
ntology, usually a graph database is used). This is why SHACL was invented.=
The best practice now is to define your domain in OWL and data integrity c=
onstraints in SHACL.=C2=A0</p><p>One more thing: depending on your requirem=
ents you probably will eventually need a way to interact with your OWL and =
SHACL with a programming language. E.g., if you want a user interface, need=
to upload data, integrate with existing systems, etc. There are two ways t=
o do this:=C2=A0</p><p>1) Use a library. This is probably what you want. If=
you work in Python you can use RDFLib or OWLReady2. Both are free. I stick=
to RDFLib. It doesn't do as much as OWLReady2 but it is a bit more sta=
ble... although I really haven't used OWLReady2 so shouldn't say mu=
ch about it. Based on recommendations from some of my colleagues I use=C2=
=A0
RDFLib and so far it does everything I want. If you want to see an example =
RDFLib code, here is a Python function I wrote recently using RDFLib. It ge=
nerates what I call embedding_note values. The use case is when you use OWL=
for graph RAG, the actual knowledge in the graph isn't available to th=
e LLM. This function is a quick and dirty (and surprisingly effective so fa=
r) way to generate strings that summarize info in the graph in a way that c=
an also be recognized by the LLM:=C2=A0<a href=3D"https://github.com/mdebel=
lis/data_catalog_knowledge_graph/blob/main/src/add_embedding_notes_from_pro=
perties.py">https://github.com/mdebellis/data_catalog_knowledge_graph/blob/=
main/src/add_embedding_notes_from_properties.py</a> That function shows how=
you read, parse, and output a Turtle file which is one format to save an O=
WL ontology.=C2=A0</p><p>2) Use a triplestore graph DB. For research purpos=
es, the commercial triplestore graph vendors are surprisingly open to using=
their tools. They all have a "community version" which you can&#=
39;t use for any for profit uses but for research the restrictions are quit=
e reasonable and you can do a lot while staying within their boundaries. Do=
ing this gives you access to all kinds of additional libraries and tools.=
=C2=A0 E.g., the tools to draw arbitrary graphs are much more powerful and =
usable than the graphing tools in Protege.=C2=A0</p><p>Here is an example o=
f building a simple user interface for a graph RAG system developed with Al=
legroGraph:=C2=A0<a href=3D"https://github.com/mdebellis/Climate_Obstructio=
n/blob/main/src/ui_md_v2.py">https://github.com/mdebellis/Climate_Obstructi=
on/blob/main/src/ui_md_v2.py</a>=C2=A0 If you do use AllegroGraph you might=
also find the following useful. What this does is encapsulate the most com=
mon interactions with AllegroGraph in higher level Python functions. If you=
look at that UI file it has almost nothing specific to AllegroGraph, that =
is because it uses this api file. The idea is eventually I can make other l=
ibraries with the same function signatures so that it is very easy to use d=
ifferent graph databases:=C2=A0<a href=3D"https://github.com/mdebellis/Clim=
ate_Obstruction/blob/main/src/ag_api.py">https://github.com/mdebellis/Clima=
te_Obstruction/blob/main/src/ag_api.py</a></p><p>Finally, I used ChatGPT to=
check some of the things I said above and in the process it volunteered to=
generate a draft of an OWL model for DNS. Below is what it came up with. A=
lso, sometimes when you copy/paste from text into a file you can get random=
bits of noise that the Protege parser doesn't like so I extracted the =
following (minus the SHACL) to a file that I knew would parse with Protege =
and that file is attached.</p><p>Michael</p><p><a href=3D"https://www.micha=
eldebellis.com/blog">https://www.michaeldebellis.com/blog</a></p><p><br>@pr=
efix ex: =C2=A0 =C2=A0<<a href=3D"https://example.org/dns#">https://exam=
ple.org/dns#</a>> .<br>@prefix rdf: =C2=A0 <<a href=3D"http://www.w3.=
org/1999/02/22-rdf-syntax-ns#">http://www.w3.org/1999/02/22-rdf-syntax-ns#<=
/a>> .<br>@prefix rdfs: =C2=A0<<a href=3D"http://www.w3.org/2000/01/r=
df-schema#">http://www.w3.org/2000/01/rdf-schema#</a>> .<br>@prefix owl:=
=C2=A0 <<a href=3D"http://www.w3.org/2002/07/owl#">http://www.w3.org/20=
02/07/owl#</a>> .<br>@prefix xsd: =C2=A0 <<a href=3D"http://www.w3.or=
g/2001/XMLSchema#">http://www.w3.org/2001/XMLSchema#</a>> .<br>@prefix s=
h: =C2=A0 =C2=A0<<a href=3D"http://www.w3.org/ns/shacl#">http://www.w3.o=
rg/ns/shacl#</a>> .<br><br>#############################################=
####################<br># Ontology<br>#####################################=
############################<br><br>ex: a owl:Ontology ;<br>=C2=A0 rdfs:lab=
el "DNS Infrastructure Ontology"@en ;<br>=C2=A0 rdfs:comment &quo=
t;A starter ontology for modeling domains, zones, nameservers, registrars, =
providers, and DNS resource records."@en .<br><br>####################=
#############################################<br># Core classes<br>########=
#########################################################<br><br>ex:Domain =
a owl:Class ;<br>=C2=A0 rdfs:label "Domain"@en .<br><br>ex:Zone a=
owl:Class ;<br>=C2=A0 rdfs:label "Zone"@en .<br><br>ex:DNS_Recor=
d a owl:Class ;<br>=C2=A0 rdfs:label "DNS record"@en .<br><br>ex:=
A_Record a owl:Class ;<br>=C2=A0 rdfs:subClassOf ex:DNS_Record ;<br>=C2=A0 =
rdfs:label "A record"@en .<br><br>ex:AAAA_Record a owl:Class ;<br=
>=C2=A0 rdfs:subClassOf ex:DNS_Record ;<br>=C2=A0 rdfs:label "AAAA rec=
ord"@en .<br><br>ex:CNAME_Record a owl:Class ;<br>=C2=A0 rdfs:subClass=
Of ex:DNS_Record ;<br>=C2=A0 rdfs:label "CNAME record"@en .<br><b=
r>ex:MX_Record a owl:Class ;<br>=C2=A0 rdfs:subClassOf ex:DNS_Record ;<br>=
=C2=A0 rdfs:label "MX record"@en .<br><br>ex:NS_Record a owl:Clas=
s ;<br>=C2=A0 rdfs:subClassOf ex:DNS_Record ;<br>=C2=A0 rdfs:label "NS=
record"@en .<br><br>ex:TXT_Record a owl:Class ;<br>=C2=A0 rdfs:subCla=
ssOf ex:DNS_Record ;<br>=C2=A0 rdfs:label "TXT record"@en .<br><b=
r>ex:SOA_Record a owl:Class ;<br>=C2=A0 rdfs:subClassOf ex:DNS_Record ;<br>=
=C2=A0 rdfs:label "SOA record"@en .<br><br>ex:PTR_Record a owl:Cl=
ass ;<br>=C2=A0 rdfs:subClassOf ex:DNS_Record ;<br>=C2=A0 rdfs:label "=
PTR record"@en .<br><br>ex:IPAddress a owl:Class ;<br>=C2=A0 rdfs:labe=
l "IP address"@en .<br><br>ex:IPv4_Address a owl:Class ;<br>=C2=
=A0 rdfs:subClassOf ex:IPAddress ;<br>=C2=A0 rdfs:label "IPv4 address&=
quot;@en .<br><br>ex:IPv6_Address a owl:Class ;<br>=C2=A0 rdfs:subClassOf e=
x:IPAddress ;<br>=C2=A0 rdfs:label "IPv6 address"@en .<br><br>ex:=
Host a owl:Class ;<br>=C2=A0 rdfs:label "Host"@en .<br><br>ex:Mai=
l_Server a owl:Class ;<br>=C2=A0 rdfs:subClassOf ex:Host ;<br>=C2=A0 rdfs:l=
abel "Mail server"@en .<br><br>ex:Name_Server a owl:Class ;<br>=
=C2=A0 rdfs:subClassOf ex:Host ;<br>=C2=A0 rdfs:label "Name server&quo=
t;@en .<br><br>ex:Registrar a owl:Class ;<br>=C2=A0 rdfs:label "Regist=
rar"@en .<br><br>ex:Hosting_Provider a owl:Class ;<br>=C2=A0 rdfs:labe=
l "Hosting provider"@en .<br><br>ex:DNS_Provider a owl:Class ;<br=
>=C2=A0 rdfs:label "DNS provider"@en .<br><br>ex:Policy_Text a ow=
l:Class ;<br>=C2=A0 rdfs:label "Policy text"@en .<br><br>########=
#########################################################<br># Object prope=
rties<br>#################################################################<=
br><br>ex:has_zone a owl:ObjectProperty ;<br>=C2=A0 rdfs:domain ex:Domain ;=
<br>=C2=A0 rdfs:range ex:Zone ;<br>=C2=A0 rdfs:label "has zone"@e=
n .<br><br>ex:has_dns_record a owl:ObjectProperty ;<br>=C2=A0 rdfs:domain e=
x:Domain ;<br>=C2=A0 rdfs:range ex:DNS_Record ;<br>=C2=A0 rdfs:label "=
has DNS record"@en .<br><br>ex:in_zone a owl:ObjectProperty ;<br>=C2=
=A0 rdfs:domain ex:DNS_Record ;<br>=C2=A0 rdfs:range ex:Zone ;<br>=C2=A0 rd=
fs:label "in zone"@en .<br><br>ex:for_domain a owl:ObjectProperty=
;<br>=C2=A0 rdfs:domain ex:DNS_Record ;<br>=C2=A0 rdfs:range ex:Domain ;<b=
r>=C2=A0 rdfs:label "for domain"@en .<br><br>ex:points_to_ip a ow=
l:ObjectProperty ;<br>=C2=A0 rdfs:domain ex:A_Record ;<br>=C2=A0 rdfs:range=
ex:IPv4_Address ;<br>=C2=A0 rdfs:label "points to IPv4 address"@=
en .<br><br>ex:points_to_ipv6 a owl:ObjectProperty ;<br>=C2=A0 rdfs:domain =
ex:AAAA_Record ;<br>=C2=A0 rdfs:range ex:IPv6_Address ;<br>=C2=A0 rdfs:labe=
l "points to IPv6 address"@en .<br><br>ex:alias_for a owl:ObjectP=
roperty ;<br>=C2=A0 rdfs:domain ex:CNAME_Record ;<br>=C2=A0 rdfs:range ex:D=
omain ;<br>=C2=A0 rdfs:label "alias for"@en .<br><br>ex:mail_exch=
anger a owl:ObjectProperty ;<br>=C2=A0 rdfs:domain ex:MX_Record ;<br>=C2=A0=
rdfs:range ex:Mail_Server ;<br>=C2=A0 rdfs:label "mail exchanger"=
;@en .<br><br>ex:authoritative_nameserver a owl:ObjectProperty ;<br>=C2=A0 =
rdfs:domain ex:NS_Record ;<br>=C2=A0 rdfs:range ex:Name_Server ;<br>=C2=A0 =
rdfs:label "authoritative nameserver"@en .<br><br>ex:reverse_maps=
_to a owl:ObjectProperty ;<br>=C2=A0 rdfs:domain ex:PTR_Record ;<br>=C2=A0 =
rdfs:range ex:Domain ;<br>=C2=A0 rdfs:label "reverse maps to"@en =
.<br><br>ex:registered_with a owl:ObjectProperty ;<br>=C2=A0 rdfs:domain ex=
:Domain ;<br>=C2=A0 rdfs:range ex:Registrar ;<br>=C2=A0 rdfs:label "re=
gistered with"@en .<br><br>ex:hosted_by a owl:ObjectProperty ;<br>=C2=
=A0 rdfs:domain ex:Domain ;<br>=C2=A0 rdfs:range ex:Hosting_Provider ;<br>=
=C2=A0 rdfs:label "hosted by"@en .<br><br>ex:dns_served_by a owl:=
ObjectProperty ;<br>=C2=A0 rdfs:domain ex:Domain ;<br>=C2=A0 rdfs:range ex:=
DNS_Provider ;<br>=C2=A0 rdfs:label "DNS served by"@en .<br><br>e=
x:has_subdomain a owl:ObjectProperty , owl:TransitiveProperty ;<br>=C2=A0 r=
dfs:domain ex:Domain ;<br>=C2=A0 rdfs:range ex:Domain ;<br>=C2=A0 rdfs:labe=
l "has subdomain"@en .<br><br>ex:subdomain_of a owl:ObjectPropert=
y , owl:TransitiveProperty ;<br>=C2=A0 owl:inverseOf ex:has_subdomain ;<br>=
=C2=A0 rdfs:domain ex:Domain ;<br>=C2=A0 rdfs:range ex:Domain ;<br>=C2=A0 r=
dfs:label "subdomain of"@en .<br><br>############################=
#####################################<br># Data properties<br>#############=
####################################################<br><br>ex:fqdn a owl:D=
atatypeProperty ;<br>=C2=A0 rdfs:domain ex:Domain ;<br>=C2=A0 rdfs:range xs=
d:string ;<br>=C2=A0 rdfs:label "fully qualified domain name"@en =
.<br><br>ex:record_name a owl:DatatypeProperty ;<br>=C2=A0 rdfs:domain ex:D=
NS_Record ;<br>=C2=A0 rdfs:range xsd:string ;<br>=C2=A0 rdfs:label "re=
cord name"@en .<br><br>ex:ttl_seconds a owl:DatatypeProperty ;<br>=C2=
=A0 rdfs:domain ex:DNS_Record ;<br>=C2=A0 rdfs:range xsd:integer ;<br>=C2=
=A0 rdfs:label "TTL seconds"@en .<br><br>ex:preference a owl:Data=
typeProperty ;<br>=C2=A0 rdfs:domain ex:MX_Record ;<br>=C2=A0 rdfs:range xs=
d:integer ;<br>=C2=A0 rdfs:label "MX preference"@en .<br><br>ex:t=
ext_value a owl:DatatypeProperty ;<br>=C2=A0 rdfs:domain ex:TXT_Record ;<br=
>=C2=A0 rdfs:range xsd:string ;<br>=C2=A0 rdfs:label "text value"=
@en .<br><br>ex:soa_serial a owl:DatatypeProperty ;<br>=C2=A0 rdfs:domain e=
x:SOA_Record ;<br>=C2=A0 rdfs:range xsd:integer ;<br>=C2=A0 rdfs:label &quo=
t;SOA serial"@en .<br><br>ex:address_value a owl:DatatypeProperty ;<br=
>=C2=A0 rdfs:domain ex:IPAddress ;<br>=C2=A0 rdfs:range xsd:string ;<br>=C2=
=A0 rdfs:label "address value"@en .<br><br>######################=
###########################################<br># Useful OWL restrictions<br=
>#################################################################<br><br>e=
x:A_Record rdfs:subClassOf [<br>=C2=A0 a owl:Restriction ;<br>=C2=A0 owl:on=
Property ex:points_to_ip ;<br>=C2=A0 owl:someValuesFrom ex:IPv4_Address<br>=
] .<br><br>ex:AAAA_Record rdfs:subClassOf [<br>=C2=A0 a owl:Restriction ;<b=
r>=C2=A0 owl:onProperty ex:points_to_ipv6 ;<br>=C2=A0 owl:someValuesFrom ex=
:IPv6_Address<br>] .<br><br>ex:MX_Record rdfs:subClassOf [<br>=C2=A0 a owl:=
Restriction ;<br>=C2=A0 owl:onProperty ex:mail_exchanger ;<br>=C2=A0 owl:so=
meValuesFrom ex:Mail_Server<br>] .<br><br>ex:NS_Record rdfs:subClassOf [<br=
>=C2=A0 a owl:Restriction ;<br>=C2=A0 owl:onProperty ex:authoritative_names=
erver ;<br>=C2=A0 owl:someValuesFrom ex:Name_Server<br>] .<br><br>#########=
########################################################<br># Example indiv=
iduals<br>#################################################################=
<br><br>ex:example_com a ex:Domain ;<br>=C2=A0 ex:fqdn "<a href=3D"htt=
p://example.com">example.com</a>" ;<br>=C2=A0 ex:registered_with ex:Ex=
ample_Registrar ;<br>=C2=A0 ex:dns_served_by ex:Example_DNS_Provider ;<br>=
=C2=A0 ex:hosted_by ex:Example_Hosting ;<br>=C2=A0 ex:has_subdomain ex:www_=
example_com .<br><br>ex:www_example_com a ex:Domain ;<br>=C2=A0 ex:fqdn &qu=
ot;<a href=3D"http://www.example.com">www.example.com</a>" ;<br>=C2=A0=
ex:subdomain_of ex:example_com .<br><br>ex:Example_Registrar a ex:Registra=
r ;<br>=C2=A0 rdfs:label "Example Registrar"@en .<br><br>ex:Examp=
le_DNS_Provider a ex:DNS_Provider ;<br>=C2=A0 rdfs:label "Example DNS =
Provider"@en .<br><br>ex:Example_Hosting a ex:Hosting_Provider ;<br>=
=C2=A0 rdfs:label "Example Hosting Provider"@en .<br><br>ex:ns1_e=
xample a ex:Name_Server ;<br>=C2=A0 rdfs:label "<a href=3D"http://ns1.=
example.net">ns1.example.net</a>"@en .<br><br>ex:mx1_example a ex:Mail=
_Server ;<br>=C2=A0 rdfs:label "<a href=3D"http://mx1.example.net">mx1=
.example.net</a>"@en .<br><br>ex:ip1 a ex:IPv4_Address ;<br>=C2=A0 ex:=
address_value "192.0.2.10" .<br><br>ex:ipv6_1 a ex:IPv6_Address ;=
<br>=C2=A0 ex:address_value "2001:db8::10" .<br><br>ex:a_record_1=
a ex:A_Record ;<br>=C2=A0 ex:for_domain ex:example_com ;<br>=C2=A0 ex:reco=
rd_name "<a href=3D"http://example.com">example.com</a>" ;<br>=C2=
=A0 ex:ttl_seconds 3600 ;<br>=C2=A0 ex:points_to_ip ex:ip1 .<br><br>ex:aaaa=
_record_1 a ex:AAAA_Record ;<br>=C2=A0 ex:for_domain ex:example_com ;<br>=
=C2=A0 ex:record_name "<a href=3D"http://example.com">example.com</a>&=
quot; ;<br>=C2=A0 ex:ttl_seconds 3600 ;<br>=C2=A0 ex:points_to_ipv6 ex:ipv6=
_1 .<br><br>ex:mx_record_1 a ex:MX_Record ;<br>=C2=A0 ex:for_domain ex:exam=
ple_com ;<br>=C2=A0 ex:record_name "<a href=3D"http://example.com">exa=
mple.com</a>" ;<br>=C2=A0 ex:preference 10 ;<br>=C2=A0 ex:mail_exchang=
er ex:mx1_example .<br><br>ex:ns_record_1 a ex:NS_Record ;<br>=C2=A0 ex:for=
_domain ex:example_com ;<br>=C2=A0 ex:record_name "<a href=3D"http://e=
xample.com">example.com</a>" ;<br>=C2=A0 ex:authoritative_nameserver e=
x:ns1_example .<br><br>ex:txt_record_1 a ex:TXT_Record ;<br>=C2=A0 ex:for_d=
omain ex:example_com ;<br>=C2=A0 ex:record_name "<a href=3D"http://exa=
mple.com">example.com</a>" ;<br>=C2=A0 ex:text_value "v=3Dspf1 in=
clude:_<a href=3D"http://spf.example.net">spf.example.net</a> ~all" .<=
br><br>#################################################################<br=
># Minimal SHACL examples<br>##############################################=
###################<br><br>ex:DomainShape a sh:NodeShape ;<br>=C2=A0 sh:tar=
getClass ex:Domain ;<br>=C2=A0 sh:property [<br>=C2=A0 =C2=A0 sh:path ex:ha=
s_dns_record ;<br>=C2=A0 =C2=A0 sh:minCount 1 ;<br>=C2=A0 ] .<br><br>ex:MXR=
ecordShape a sh:NodeShape ;<br>=C2=A0 sh:targetClass ex:MX_Record ;<br>=C2=
=A0 sh:property [<br>=C2=A0 =C2=A0 sh:path ex:preference ;<br>=C2=A0 =C2=A0=
sh:datatype xsd:integer ;<br>=C2=A0 =C2=A0 sh:minCount 1 ;<br>=C2=A0 =C2=
=A0 sh:maxCount 1 ;<br>=C2=A0 ] ;<br>=C2=A0 sh:property [<br>=C2=A0 =C2=A0 =
sh:path ex:mail_exchanger ;<br>=C2=A0 =C2=A0 sh:class ex:Mail_Server ;<br>=
=C2=A0 =C2=A0 sh:minCount 1 ;<br>=C2=A0 ] .</p></div></div><br><div class=
=3D"gmail_quote gmail_quote_container"><div dir=3D"ltr" class=3D"gmail_attr=
">On Thu, Mar 5, 2026 at 4:24=E2=80=AFAM Vahid Shaik <<a href=3D"mailto:=
[email protected]">[email protected]</a>> wrote:<br></div><blockquote =
class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px sol=
id rgb(204,204,204);padding-left:1ex">
<div>
<div style=3D"direction:ltr;font-family:Aptos,sans-serif;font-size:12pt;col=
or:rgb(0,0,0)">
Hi,</div>
<div style=3D"direction:ltr;font-family:Aptos,sans-serif;font-size:12pt;col=
or:rgb(0,0,0)">
<br>
</div>
<div style=3D"font-family:Aptos,sans-serif;font-size:12pt;color:rgb(0,0,0)"=
>
I'm exploring whether Protege is the right tool for modeling DNS infras=
tructure as an ontology. The idea is to represent the relationships between=
DNS record types (A, AAAA, CNAME, MX, NS, TXT, SOA, PTR), domains, nameser=
vers, registrars, and hosting providers
as a structured knowledge graph.</div>
<div style=3D"direction:ltr;font-family:Aptos,sans-serif;font-size:12pt;col=
or:rgb(0,0,0)">
<br>
</div>
<div style=3D"font-family:Aptos,sans-serif;font-size:12pt;color:rgb(0,0,0)"=
>
For example:</div>
<div style=3D"font-family:Aptos,sans-serif;font-size:12pt;color:rgb(0,0,0)"=
>
- A domain has DNS records (A, AAAA, CNAME, MX, NS, TXT)</div>
<div style=3D"font-family:Aptos,sans-serif;font-size:12pt;color:rgb(0,0,0)"=
>
- An A record points to an IPv4 address</div>
<div style=3D"font-family:Aptos,sans-serif;font-size:12pt;color:rgb(0,0,0)"=
>
- MX records point to mail servers with priority values</div>
<div style=3D"font-family:Aptos,sans-serif;font-size:12pt;color:rgb(0,0,0)"=
>
- TXT records contain SPF, DKIM, and DMARC policies</div>
<div style=3D"font-family:Aptos,sans-serif;font-size:12pt;color:rgb(0,0,0)"=
>
- A domain is registered with a registrar</div>
<div style=3D"font-family:Aptos,sans-serif;font-size:12pt;color:rgb(0,0,0)"=
>
- Nameservers are authoritative for specific domains</div>
<div style=3D"direction:ltr;font-family:Aptos,sans-serif;font-size:12pt;col=
or:rgb(0,0,0)">
<br>
</div>
<div style=3D"font-family:Aptos,sans-serif;font-size:12pt;color:rgb(0,0,0)"=
>
The goal is to build something that could help with automated DNS auditing =
=E2=80=94 given a domain, traverse the ontology to check if all expected re=
cords exist and are consistent.</div>
<div style=3D"direction:ltr;font-family:Aptos,sans-serif;font-size:12pt;col=
or:rgb(0,0,0)">
<br>
</div>
<div style=3D"font-family:Aptos,sans-serif;font-size:12pt;color:rgb(0,0,0)"=
>
I've been gathering real-world DNS data using <a href=3D"https://dnsrob=
ot.net/dns-lookup" target=3D"_blank">
https://dnsrobot.net/dns-lookup</a>=C2=A0to understand the typical relation=
ships between record types for different domain configurations (e.g., domai=
ns on Cloudflare vs AWS Route 53 have very different NS and CNAME patterns)=
.</div>
<div style=3D"direction:ltr;font-family:Aptos,sans-serif;font-size:12pt;col=
or:rgb(0,0,0)">
<br>
</div>
<div style=3D"font-family:Aptos,sans-serif;font-size:12pt;color:rgb(0,0,0)"=
>
Has anyone built a similar network infrastructure ontology in Protege? I=
9;m wondering:</div>
<div style=3D"direction:ltr;font-family:Aptos,sans-serif;font-size:12pt;col=
or:rgb(0,0,0)">
<br>
</div>
<div style=3D"font-family:Aptos,sans-serif;font-size:12pt;color:rgb(0,0,0)"=
>
1. Should I use OWL DL or OWL Full for this kind of model?</div>
<div style=3D"font-family:Aptos,sans-serif;font-size:12pt;color:rgb(0,0,0)"=
>
2. Is there an existing upper ontology that covers network/internet infrast=
ructure I could extend?</div>
<div style=3D"font-family:Aptos,sans-serif;font-size:12pt;color:rgb(0,0,0)"=
>
3. Any tips on modeling the hierarchical nature of DNS (root =E2=86=92 TLD =
=E2=86=92 SLD =E2=86=92 subdomain)?</div>
<div style=3D"direction:ltr;font-family:Aptos,sans-serif;font-size:12pt;col=
or:rgb(0,0,0)">
<br>
</div>
<div style=3D"font-family:Aptos,sans-serif;font-size:12pt;color:rgb(0,0,0)"=
>
Thanks</div>
</div>
_______________________________________________<br>
protege-user mailing list<br>
<a href=3D"mailto:[email protected]" target=3D"_blank">proteg=
[email protected]</a><br>
<a href=3D"https://mailman.stanford.edu/mailman/listinfo/protege-user" rel=
=3D"noreferrer" target=3D"_blank">https://mailman.stanford.edu/mailman/list=
info/protege-user</a><br>
</blockquote></div>
--000000000000a34cea064c5fcaec--
--000000000000a34ceb064c5fcaed
Content-Type: image/png; name="image.png"
Content-Disposition: inline; filename="image.png"
Content-Transfer-Encoding: base64
Content-ID: <ii_mmf6lpzp0>
X-Attachment-Id: ii_mmf6lpzp0
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
AElFTkSuQmCC
--000000000000a34ceb064c5fcaed--
--000000000000a34cec064c5fcaee
Content-Type: application/octet-stream; name="dns.ttl"
Content-Disposition: attachment; filename="dns.ttl"
Content-Transfer-Encoding: base64
Content-ID: <f_mmf94i8e1>
X-Attachment-Id: f_mmf94i8e1
QHByZWZpeCBleDogICAgPGh0dHBzOi8vZXhhbXBsZS5vcmcvZG5zIz4gLgpAcHJlZml4IHJkZjog
ICA8aHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIz4gLgpAcHJlZml4
IHJkZnM6ICA8aHR0cDovL3d3dy53My5vcmcvMjAwMC8wMS9yZGYtc2NoZW1hIz4gLgpAcHJlZml4
IG93bDogICA8aHR0cDovL3d3dy53My5vcmcvMjAwMi8wNy9vd2wjPiAuCkBwcmVmaXggeHNkOiAg
IDxodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSM+IC4KQHByZWZpeCBzaDogICAgPGh0
dHA6Ly93d3cudzMub3JnL25zL3NoYWNsIz4gLgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBPbnRvbG9neQojIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IwoKZXg6IGEgb3dsOk9udG9sb2d5IDsKICByZGZzOmxhYmVsICJETlMgSW5mcmFzdHJ1Y3R1cmUg
T250b2xvZ3kiQGVuIDsKICByZGZzOmNvbW1lbnQgIkEgc3RhcnRlciBvbnRvbG9neSBmb3IgbW9k
ZWxpbmcgZG9tYWlucywgem9uZXMsIG5hbWVzZXJ2ZXJzLCByZWdpc3RyYXJzLCBwcm92aWRlcnMs
IGFuZCBETlMgcmVzb3VyY2UgcmVjb3Jkcy4iQGVuIC4KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgQ29yZSBjbGFzc2Vz
CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjCgpleDpEb21haW4gYSBvd2w6Q2xhc3MgOwogIHJkZnM6bGFiZWwgIkRvbWFpbiJA
ZW4gLgoKZXg6Wm9uZSBhIG93bDpDbGFzcyA7CiAgcmRmczpsYWJlbCAiWm9uZSJAZW4gLgoKZXg6
RE5TX1JlY29yZCBhIG93bDpDbGFzcyA7CiAgcmRmczpsYWJlbCAiRE5TIHJlY29yZCJAZW4gLgoK
ZXg6QV9SZWNvcmQgYSBvd2w6Q2xhc3MgOwogIHJkZnM6c3ViQ2xhc3NPZiBleDpETlNfUmVjb3Jk
IDsKICByZGZzOmxhYmVsICJBIHJlY29yZCJAZW4gLgoKZXg6QUFBQV9SZWNvcmQgYSBvd2w6Q2xh
c3MgOwogIHJkZnM6c3ViQ2xhc3NPZiBleDpETlNfUmVjb3JkIDsKICByZGZzOmxhYmVsICJBQUFB
IHJlY29yZCJAZW4gLgoKZXg6Q05BTUVfUmVjb3JkIGEgb3dsOkNsYXNzIDsKICByZGZzOnN1YkNs
YXNzT2YgZXg6RE5TX1JlY29yZCA7CiAgcmRmczpsYWJlbCAiQ05BTUUgcmVjb3JkIkBlbiAuCgpl
eDpNWF9SZWNvcmQgYSBvd2w6Q2xhc3MgOwogIHJkZnM6c3ViQ2xhc3NPZiBleDpETlNfUmVjb3Jk
IDsKICByZGZzOmxhYmVsICJNWCByZWNvcmQiQGVuIC4KCmV4Ok5TX1JlY29yZCBhIG93bDpDbGFz
cyA7CiAgcmRmczpzdWJDbGFzc09mIGV4OkROU19SZWNvcmQgOwogIHJkZnM6bGFiZWwgIk5TIHJl
Y29yZCJAZW4gLgoKZXg6VFhUX1JlY29yZCBhIG93bDpDbGFzcyA7CiAgcmRmczpzdWJDbGFzc09m
IGV4OkROU19SZWNvcmQgOwogIHJkZnM6bGFiZWwgIlRYVCByZWNvcmQiQGVuIC4KCmV4OlNPQV9S
ZWNvcmQgYSBvd2w6Q2xhc3MgOwogIHJkZnM6c3ViQ2xhc3NPZiBleDpETlNfUmVjb3JkIDsKICBy
ZGZzOmxhYmVsICJTT0EgcmVjb3JkIkBlbiAuCgpleDpQVFJfUmVjb3JkIGEgb3dsOkNsYXNzIDsK
ICByZGZzOnN1YkNsYXNzT2YgZXg6RE5TX1JlY29yZCA7CiAgcmRmczpsYWJlbCAiUFRSIHJlY29y
ZCJAZW4gLgoKZXg6SVBBZGRyZXNzIGEgb3dsOkNsYXNzIDsKICByZGZzOmxhYmVsICJJUCBhZGRy
ZXNzIkBlbiAuCgpleDpJUHY0X0FkZHJlc3MgYSBvd2w6Q2xhc3MgOwogIHJkZnM6c3ViQ2xhc3NP
ZiBleDpJUEFkZHJlc3MgOwogIHJkZnM6bGFiZWwgIklQdjQgYWRkcmVzcyJAZW4gLgoKZXg6SVB2
Nl9BZGRyZXNzIGEgb3dsOkNsYXNzIDsKICByZGZzOnN1YkNsYXNzT2YgZXg6SVBBZGRyZXNzIDsK
ICByZGZzOmxhYmVsICJJUHY2IGFkZHJlc3MiQGVuIC4KCmV4Okhvc3QgYSBvd2w6Q2xhc3MgOwog
IHJkZnM6bGFiZWwgIkhvc3QiQGVuIC4KCmV4Ok1haWxfU2VydmVyIGEgb3dsOkNsYXNzIDsKICBy
ZGZzOnN1YkNsYXNzT2YgZXg6SG9zdCA7CiAgcmRmczpsYWJlbCAiTWFpbCBzZXJ2ZXIiQGVuIC4K
CmV4Ok5hbWVfU2VydmVyIGEgb3dsOkNsYXNzIDsKICByZGZzOnN1YkNsYXNzT2YgZXg6SG9zdCA7
CiAgcmRmczpsYWJlbCAiTmFtZSBzZXJ2ZXIiQGVuIC4KCmV4OlJlZ2lzdHJhciBhIG93bDpDbGFz
cyA7CiAgcmRmczpsYWJlbCAiUmVnaXN0cmFyIkBlbiAuCgpleDpIb3N0aW5nX1Byb3ZpZGVyIGEg
b3dsOkNsYXNzIDsKICByZGZzOmxhYmVsICJIb3N0aW5nIHByb3ZpZGVyIkBlbiAuCgpleDpETlNf
UHJvdmlkZXIgYSBvd2w6Q2xhc3MgOwogIHJkZnM6bGFiZWwgIkROUyBwcm92aWRlciJAZW4gLgoK
ZXg6UG9saWN5X1RleHQgYSBvd2w6Q2xhc3MgOwogIHJkZnM6bGFiZWwgIlBvbGljeSB0ZXh0IkBl
biAuCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIwojIE9iamVjdCBwcm9wZXJ0aWVzCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpleDpoYXNfem9uZSBh
IG93bDpPYmplY3RQcm9wZXJ0eSA7CiAgcmRmczpkb21haW4gZXg6RG9tYWluIDsKICByZGZzOnJh
bmdlIGV4OlpvbmUgOwogIHJkZnM6bGFiZWwgImhhcyB6b25lIkBlbiAuCgpleDpoYXNfZG5zX3Jl
Y29yZCBhIG93bDpPYmplY3RQcm9wZXJ0eSA7CiAgcmRmczpkb21haW4gZXg6RG9tYWluIDsKICBy
ZGZzOnJhbmdlIGV4OkROU19SZWNvcmQgOwogIHJkZnM6bGFiZWwgImhhcyBETlMgcmVjb3JkIkBl
biAuCgpleDppbl96b25lIGEgb3dsOk9iamVjdFByb3BlcnR5IDsKICByZGZzOmRvbWFpbiBleDpE
TlNfUmVjb3JkIDsKICByZGZzOnJhbmdlIGV4OlpvbmUgOwogIHJkZnM6bGFiZWwgImluIHpvbmUi
QGVuIC4KCmV4OmZvcl9kb21haW4gYSBvd2w6T2JqZWN0UHJvcGVydHkgOwogIHJkZnM6ZG9tYWlu
IGV4OkROU19SZWNvcmQgOwogIHJkZnM6cmFuZ2UgZXg6RG9tYWluIDsKICByZGZzOmxhYmVsICJm
b3IgZG9tYWluIkBlbiAuCgpleDpwb2ludHNfdG9faXAgYSBvd2w6T2JqZWN0UHJvcGVydHkgOwog
IHJkZnM6ZG9tYWluIGV4OkFfUmVjb3JkIDsKICByZGZzOnJhbmdlIGV4OklQdjRfQWRkcmVzcyA7
CiAgcmRmczpsYWJlbCAicG9pbnRzIHRvIElQdjQgYWRkcmVzcyJAZW4gLgoKZXg6cG9pbnRzX3Rv
X2lwdjYgYSBvd2w6T2JqZWN0UHJvcGVydHkgOwogIHJkZnM6ZG9tYWluIGV4OkFBQUFfUmVjb3Jk
IDsKICByZGZzOnJhbmdlIGV4OklQdjZfQWRkcmVzcyA7CiAgcmRmczpsYWJlbCAicG9pbnRzIHRv
IElQdjYgYWRkcmVzcyJAZW4gLgoKZXg6YWxpYXNfZm9yIGEgb3dsOk9iamVjdFByb3BlcnR5IDsK
ICByZGZzOmRvbWFpbiBleDpDTkFNRV9SZWNvcmQgOwogIHJkZnM6cmFuZ2UgZXg6RG9tYWluIDsK
ICByZGZzOmxhYmVsICJhbGlhcyBmb3IiQGVuIC4KCmV4Om1haWxfZXhjaGFuZ2VyIGEgb3dsOk9i
amVjdFByb3BlcnR5IDsKICByZGZzOmRvbWFpbiBleDpNWF9SZWNvcmQgOwogIHJkZnM6cmFuZ2Ug
ZXg6TWFpbF9TZXJ2ZXIgOwogIHJkZnM6bGFiZWwgIm1haWwgZXhjaGFuZ2VyIkBlbiAuCgpleDph
dXRob3JpdGF0aXZlX25hbWVzZXJ2ZXIgYSBvd2w6T2JqZWN0UHJvcGVydHkgOwogIHJkZnM6ZG9t
YWluIGV4Ok5TX1JlY29yZCA7CiAgcmRmczpyYW5nZSBleDpOYW1lX1NlcnZlciA7CiAgcmRmczps
YWJlbCAiYXV0aG9yaXRhdGl2ZSBuYW1lc2VydmVyIkBlbiAuCgpleDpyZXZlcnNlX21hcHNfdG8g
YSBvd2w6T2JqZWN0UHJvcGVydHkgOwogIHJkZnM6ZG9tYWluIGV4OlBUUl9SZWNvcmQgOwogIHJk
ZnM6cmFuZ2UgZXg6RG9tYWluIDsKICByZGZzOmxhYmVsICJyZXZlcnNlIG1hcHMgdG8iQGVuIC4K
CmV4OnJlZ2lzdGVyZWRfd2l0aCBhIG93bDpPYmplY3RQcm9wZXJ0eSA7CiAgcmRmczpkb21haW4g
ZXg6RG9tYWluIDsKICByZGZzOnJhbmdlIGV4OlJlZ2lzdHJhciA7CiAgcmRmczpsYWJlbCAicmVn
aXN0ZXJlZCB3aXRoIkBlbiAuCgpleDpob3N0ZWRfYnkgYSBvd2w6T2JqZWN0UHJvcGVydHkgOwog
IHJkZnM6ZG9tYWluIGV4OkRvbWFpbiA7CiAgcmRmczpyYW5nZSBleDpIb3N0aW5nX1Byb3ZpZGVy
IDsKICByZGZzOmxhYmVsICJob3N0ZWQgYnkiQGVuIC4KCmV4OmRuc19zZXJ2ZWRfYnkgYSBvd2w6
T2JqZWN0UHJvcGVydHkgOwogIHJkZnM6ZG9tYWluIGV4OkRvbWFpbiA7CiAgcmRmczpyYW5nZSBl
eDpETlNfUHJvdmlkZXIgOwogIHJkZnM6bGFiZWwgIkROUyBzZXJ2ZWQgYnkiQGVuIC4KCmV4Omhh
c19zdWJkb21haW4gYSBvd2w6T2JqZWN0UHJvcGVydHkgLCBvd2w6VHJhbnNpdGl2ZVByb3BlcnR5
IDsKICByZGZzOmRvbWFpbiBleDpEb21haW4gOwogIHJkZnM6cmFuZ2UgZXg6RG9tYWluIDsKICBy
ZGZzOmxhYmVsICJoYXMgc3ViZG9tYWluIkBlbiAuCgpleDpzdWJkb21haW5fb2YgYSBvd2w6T2Jq
ZWN0UHJvcGVydHkgLCBvd2w6VHJhbnNpdGl2ZVByb3BlcnR5IDsKICBvd2w6aW52ZXJzZU9mIGV4
Omhhc19zdWJkb21haW4gOwogIHJkZnM6ZG9tYWluIGV4OkRvbWFpbiA7CiAgcmRmczpyYW5nZSBl
eDpEb21haW4gOwogIHJkZnM6bGFiZWwgInN1YmRvbWFpbiBvZiJAZW4gLgoKIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBE
YXRhIHByb3BlcnRpZXMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmV4OmZxZG4gYSBvd2w6RGF0YXR5cGVQcm9wZXJ0eSA7
CiAgcmRmczpkb21haW4gZXg6RG9tYWluIDsKICByZGZzOnJhbmdlIHhzZDpzdHJpbmcgOwogIHJk
ZnM6bGFiZWwgImZ1bGx5IHF1YWxpZmllZCBkb21haW4gbmFtZSJAZW4gLgoKZXg6cmVjb3JkX25h
bWUgYSBvd2w6RGF0YXR5cGVQcm9wZXJ0eSA7CiAgcmRmczpkb21haW4gZXg6RE5TX1JlY29yZCA7
CiAgcmRmczpyYW5nZSB4c2Q6c3RyaW5nIDsKICByZGZzOmxhYmVsICJyZWNvcmQgbmFtZSJAZW4g
LgoKZXg6dHRsX3NlY29uZHMgYSBvd2w6RGF0YXR5cGVQcm9wZXJ0eSA7CiAgcmRmczpkb21haW4g
ZXg6RE5TX1JlY29yZCA7CiAgcmRmczpyYW5nZSB4c2Q6aW50ZWdlciA7CiAgcmRmczpsYWJlbCAi
VFRMIHNlY29uZHMiQGVuIC4KCmV4OnByZWZlcmVuY2UgYSBvd2w6RGF0YXR5cGVQcm9wZXJ0eSA7
CiAgcmRmczpkb21haW4gZXg6TVhfUmVjb3JkIDsKICByZGZzOnJhbmdlIHhzZDppbnRlZ2VyIDsK
ICByZGZzOmxhYmVsICJNWCBwcmVmZXJlbmNlIkBlbiAuCgpleDp0ZXh0X3ZhbHVlIGEgb3dsOkRh
dGF0eXBlUHJvcGVydHkgOwogIHJkZnM6ZG9tYWluIGV4OlRYVF9SZWNvcmQgOwogIHJkZnM6cmFu
Z2UgeHNkOnN0cmluZyA7CiAgcmRmczpsYWJlbCAidGV4dCB2YWx1ZSJAZW4gLgoKZXg6c29hX3Nl
cmlhbCBhIG93bDpEYXRhdHlwZVByb3BlcnR5IDsKICByZGZzOmRvbWFpbiBleDpTT0FfUmVjb3Jk
IDsKICByZGZzOnJhbmdlIHhzZDppbnRlZ2VyIDsKICByZGZzOmxhYmVsICJTT0Egc2VyaWFsIkBl
biAuCgpleDphZGRyZXNzX3ZhbHVlIGEgb3dsOkRhdGF0eXBlUHJvcGVydHkgOwogIHJkZnM6ZG9t
YWluIGV4OklQQWRkcmVzcyA7CiAgcmRmczpyYW5nZSB4c2Q6c3RyaW5nIDsKICByZGZzOmxhYmVs
ICJhZGRyZXNzIHZhbHVlIkBlbiAuCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFVzZWZ1bCBPV0wgcmVzdHJpY3Rpb25z
CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjCgpleDpBX1JlY29yZCByZGZzOnN1YkNsYXNzT2YgWwogIGEgb3dsOlJlc3RyaWN0
aW9uIDsKICBvd2w6b25Qcm9wZXJ0eSBleDpwb2ludHNfdG9faXAgOwogIG93bDpzb21lVmFsdWVz
RnJvbSBleDpJUHY0X0FkZHJlc3MKXSAuCgpleDpBQUFBX1JlY29yZCByZGZzOnN1YkNsYXNzT2Yg
WwogIGEgb3dsOlJlc3RyaWN0aW9uIDsKICBvd2w6b25Qcm9wZXJ0eSBleDpwb2ludHNfdG9faXB2
NiA7CiAgb3dsOnNvbWVWYWx1ZXNGcm9tIGV4OklQdjZfQWRkcmVzcwpdIC4KCmV4Ok1YX1JlY29y
ZCByZGZzOnN1YkNsYXNzT2YgWwogIGEgb3dsOlJlc3RyaWN0aW9uIDsKICBvd2w6b25Qcm9wZXJ0
eSBleDptYWlsX2V4Y2hhbmdlciA7CiAgb3dsOnNvbWVWYWx1ZXNGcm9tIGV4Ok1haWxfU2VydmVy
Cl0gLgoKZXg6TlNfUmVjb3JkIHJkZnM6c3ViQ2xhc3NPZiBbCiAgYSBvd2w6UmVzdHJpY3Rpb24g
OwogIG93bDpvblByb3BlcnR5IGV4OmF1dGhvcml0YXRpdmVfbmFtZXNlcnZlciA7CiAgb3dsOnNv
bWVWYWx1ZXNGcm9tIGV4Ok5hbWVfU2VydmVyCl0gLgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBFeGFtcGxlIGluZGl2
aWR1YWxzCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjCgpleDpleGFtcGxlX2NvbSBhIGV4OkRvbWFpbiA7CiAgZXg6ZnFkbiAi
ZXhhbXBsZS5jb20iIDsKICBleDpyZWdpc3RlcmVkX3dpdGggZXg6RXhhbXBsZV9SZWdpc3RyYXIg
OwogIGV4OmRuc19zZXJ2ZWRfYnkgZXg6RXhhbXBsZV9ETlNfUHJvdmlkZXIgOwogIGV4Omhvc3Rl
ZF9ieSBleDpFeGFtcGxlX0hvc3RpbmcgOwogIGV4Omhhc19zdWJkb21haW4gZXg6d3d3X2V4YW1w
bGVfY29tIC4KCmV4Ond3d19leGFtcGxlX2NvbSBhIGV4OkRvbWFpbiA7CiAgZXg6ZnFkbiAid3d3
LmV4YW1wbGUuY29tIiA7CiAgZXg6c3ViZG9tYWluX29mIGV4OmV4YW1wbGVfY29tIC4KCmV4OkV4
YW1wbGVfUmVnaXN0cmFyIGEgZXg6UmVnaXN0cmFyIDsKICByZGZzOmxhYmVsICJFeGFtcGxlIFJl
Z2lzdHJhciJAZW4gLgoKZXg6RXhhbXBsZV9ETlNfUHJvdmlkZXIgYSBleDpETlNfUHJvdmlkZXIg
OwogIHJkZnM6bGFiZWwgIkV4YW1wbGUgRE5TIFByb3ZpZGVyIkBlbiAuCgpleDpFeGFtcGxlX0hv
c3RpbmcgYSBleDpIb3N0aW5nX1Byb3ZpZGVyIDsKICByZGZzOmxhYmVsICJFeGFtcGxlIEhvc3Rp
bmcgUHJvdmlkZXIiQGVuIC4KCmV4Om5zMV9leGFtcGxlIGEgZXg6TmFtZV9TZXJ2ZXIgOwogIHJk
ZnM6bGFiZWwgIm5zMS5leGFtcGxlLm5ldCJAZW4gLgoKZXg6bXgxX2V4YW1wbGUgYSBleDpNYWls
X1NlcnZlciA7CiAgcmRmczpsYWJlbCAibXgxLmV4YW1wbGUubmV0IkBlbiAuCgpleDppcDEgYSBl
eDpJUHY0X0FkZHJlc3MgOwogIGV4OmFkZHJlc3NfdmFsdWUgIjE5Mi4wLjIuMTAiIC4KCmV4Omlw
djZfMSBhIGV4OklQdjZfQWRkcmVzcyA7CiAgZXg6YWRkcmVzc192YWx1ZSAiMjAwMTpkYjg6OjEw
IiAuCgpleDphX3JlY29yZF8xIGEgZXg6QV9SZWNvcmQgOwogIGV4OmZvcl9kb21haW4gZXg6ZXhh
bXBsZV9jb20gOwogIGV4OnJlY29yZF9uYW1lICJleGFtcGxlLmNvbSIgOwogIGV4OnR0bF9zZWNv
bmRzIDM2MDAgOwogIGV4OnBvaW50c190b19pcCBleDppcDEgLgoKZXg6YWFhYV9yZWNvcmRfMSBh
IGV4OkFBQUFfUmVjb3JkIDsKICBleDpmb3JfZG9tYWluIGV4OmV4YW1wbGVfY29tIDsKICBleDpy
ZWNvcmRfbmFtZSAiZXhhbXBsZS5jb20iIDsKICBleDp0dGxfc2Vjb25kcyAzNjAwIDsKICBleDpw
b2ludHNfdG9faXB2NiBleDppcHY2XzEgLgoKZXg6bXhfcmVjb3JkXzEgYSBleDpNWF9SZWNvcmQg
OwogIGV4OmZvcl9kb21haW4gZXg6ZXhhbXBsZV9jb20gOwogIGV4OnJlY29yZF9uYW1lICJleGFt
cGxlLmNvbSIgOwogIGV4OnByZWZlcmVuY2UgMTAgOwogIGV4Om1haWxfZXhjaGFuZ2VyIGV4Om14
MV9leGFtcGxlIC4KCmV4Om5zX3JlY29yZF8xIGEgZXg6TlNfUmVjb3JkIDsKICBleDpmb3JfZG9t
YWluIGV4OmV4YW1wbGVfY29tIDsKICBleDpyZWNvcmRfbmFtZSAiZXhhbXBsZS5jb20iIDsKICBl
eDphdXRob3JpdGF0aXZlX25hbWVzZXJ2ZXIgZXg6bnMxX2V4YW1wbGUgLgoKZXg6dHh0X3JlY29y
ZF8xIGEgZXg6VFhUX1JlY29yZCA7CiAgZXg6Zm9yX2RvbWFpbiBleDpleGFtcGxlX2NvbSA7CiAg
ZXg6cmVjb3JkX25hbWUgImV4YW1wbGUuY29tIiA7CiAgZXg6dGV4dF92YWx1ZSAidj1zcGYxIGlu
Y2x1ZGU6X3NwZi5leGFtcGxlLm5ldCB+YWxsIiAu
--000000000000a34cec064c5fcaee
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
_______________________________________________
protege-user mailing list
[email protected]
https://mailman.stanford.edu/mailman/listinfo/protege-user
--000000000000a34cec064c5fcaee--