This feedback is based on the version of FIBO BE & FND & FND that I got from David Newman on December 3, 2015. Some this may need to be updated.

Request for Clarification

IndependentParty vs. AutonomousAgent

What if any relationship is there between IndependentParty and AutonomousAgent? It makes sense that every IndependentParty is an AutonomousAgent, but that subclass relationship is not there.

Occurrence, OccurrenceKind & TransactionEvent

Payment and Payment Event

Recommended Changes

Definition not match axioms 

Making things simpler

Contract and ContractTermsSet

Restrictions that should be min 0

Not all Occurrences have a location – oc:Occurrence has the restriction: fibo-fnd-plc-loc:isLocatedAt exactly 1 fibo-fnd-plc-loc:Location where Location can be either  vitural of physical. However, not all Occurrences can be said to occur at some location. For example, consider a requst from a lender to a credit agency for a credit report. The request might be send via email, or it might be direct to another sytem via an API. In neither case is there any virtual location that can usefully be said to be where the request happened.  

Naming Conventions for MediatingThings, ThingsInRole & RelativeThings & connecting properties

There is a property called isProducedBy which is supposed to only be used with RelativeThings. For the record, the definition is currently:  “The target or range of this property should be read as always being some kind of 'relative thing', that is a thing defined in some context. Generally this will be a 'party in role'. This property is not intended to be used to relate a thing to some independent thing which it is provided by, only to something in the role of being that which provides it.”  

That means if one wants to say MichaelUschold provides a Document, you have to create a fictitious instance that means MichaelUscholdAsProvider.  To avoid that, I need another property for isProvidedBy(provides) that connects directly to MichaelUschold.  What should that be, and how can it be made obvious that it connects to the other version of the property?

There is another problem. isProvidedBy and isUsedBy use the exact same grammatical form for the name. Yet, one is for exclusive use with Relative things, and the other is not. It would be nice if there was a hint about this.  Given that use with relative things should be the exception rather than the rule, we could have a convention to highlight that the propery is for use with only Relative Things.   The same solution can apply to subclasses of ThingInRole.

Common names like Asset and Bank cannot be used in the common sense way because they are subclasses of a the class: ThingInRole.   There are two things:

  1. An independent party that is a corporation that provides banking services.  We use the term “Bank” for this in everyday parlance. It is a real thing.
  2. A party in the role of a bank:  an independent corporation providing banking services.  There is no everyday parlance for this, it is a fiction created to solve complex modeling scenarios about roles that occasionaly arise .  FIBO calls this a Bank.

This is backwards, the thing with no common name should have a name that gives some hint that it is the fictitious thing that means PartyInTheRoleOfABank, and the common everyday thing that people call a bank should be called Bank in FIBO.    ThingsInRole: should be hidden from view, and only used on occasion, not baked into FIBO infrastructure. 

Proposed Solution: 

IDEALLY: have the non-ThingInRole name be the usual name that you expect, e.g. isProducedBy, and if you want one that is only to be used for ThingsInRole  then append _R to the name. e.g. isProducedBy_R. This way you can see that the two properties are linked, one is defined as a property chain using the other. Subclasses of ThingInRole, like Asset and Bank should be renamed to Asset_R and Bank_R and Bank and Asset should be used to mean what every one will think they mean. In this world, there may be a handful of classes and properties that have an _R suffix, and most will not. 

ALTERNATIVE: A less disruptive (and hopefully temporary) option that can be implemented immediately is to use the suffixes as needed when creating a version that is not there.  For example, I created a property called isProducedBy_I for what I needed above. Now it is clearly linked to the other version.  All the ThingInRole classes like Bank and Asset can have their IndependentParty versions called Bank_I & Asset_I. I needed to have a new Class called CreditRepository, but I sure don't want the _R version. For now, given the current naming convention, I will create a class called CreditRepository_I and not bother creating the _R version since I cannot imagine a time when it would be needed. 

This example points out something else.  The definition tells us to only use the isProducedBy property when the property is acting in the producer role.  In this case they are producing the credit report in their role as a credit reporting agency, not more norrowly as a producer.  Experian might produce something else but not in their role as a CreditReportingAgency, this would require yet another role instance for Experian.  Yet another reason to avoid mediating things whenver possible.

ReFactoring Suggestions

Properties with too narrow domain and/or range

rel:refersTo property has too narrow domain (Reference)

The property refersTo in the relations ontology has an overly narrow domain: Reference.  Every Reference refersTo something, but a person or a document or a report can refer to something, and it is not true that individual persons, documents or reporets are examples of " a concept that refers to (or stands in for) another concept".

For loans, I have a class called PublicRecord for bankruptcies, tax liens, wage garnishments etc. These are legal documents that often refer to specific accounts. I want to use the refersTo property but this will generate an untrue inference.  Given the dearth of disjoint axioms, this will probabaly not be caught by inference, but we don't want incorrect inferences, just the same. I doubt we need two refersTo properties, one specific to Referencee and one more general.

There are many other examples of problems.

Proposed solution: just remove the domain for refersTo, and from all other properties that have indeterminately broad potential usage.

doc:hasExpirationDate has too narrow domain (Document)

It is currently not possible for an agreement to have an expiration date, because only Documents are allowed to have expiration dates

Proposed solution: just remove the domain for doc:hasExpirationDate

doc:hasDateOfIssuance has too narrow domain (Document)

It is currently not possible for anything to be issued unless it is a Document, thus the current ontology requires every financial instrument (which is currently a WrittenContract) to also be a Document.  Is that desirable?  

Proposed solution: just remove the domain for doc:hasDate

fd:hasCount has too narrow domain (RegularSchedule)

Data property: hasCount only applies to a RegularSchedule, but many things can be counted, e.g. the number of entries in a report, or number of members of a collection.

Proposed solution: just remove the domain for fd:hasCount

rel:uses has too narrow domain (AutonomousAgent)

The domain for uses is AutonomousAgent. Unlike the other examples, this one immediately seems reasonable and defensible from an intuitive and ontological perspective. Yet from a practical perspective, the domain is still too narrow. Outside of finance per se you can say an Argument uses a line of reasoning or that ontology uses a design pattern.  This is convenient and useful (as it were), even though strictly, the agent creating the argument or the ontology is doing the direct using.  In finance, there is a CreditScoring Occurrence whereby an algorithm is used to compute the credit score.  Strictly  the agent doing the work was using the model. But there is no reason to introduce an Agent here, that information is never tracked. I want to use the rel:uses property to link the credit scoring occurrence directly to the model.  In English this is fine, it makes sense to say algorithm X was used by this Occurrence of coming up with a credit score.   Lots of things might use something else, and it is hard to say what they all might be, so probably best to remove the domain. An alternate strategy is to try soemthing like Agent OR Occurrence (and anything else we can thyink of) and then if we run inference one day and find a problem we can keep extending the domain as needed. Not clear what the pros/cons are. 

Proposed solution: just remove the domain for rel:uses

rel:isMemberOf has too narrow domain 

isMemberOf should be general, now there is need to create a isGenericMemberOf.
UPDATE: this may have been fixed now. 

Suggested Changes to class and property hierarchies 

Changes to class hierarchy 


Changes to property hierarchy 

Check for date properties that should be a subproperty of fd:hasDate. For example:


Make corp:hasDateOfIncorporation a subproperty of (a new property called hasCreationDate which is a subproperty of) fd:hasStartDate  

Recommended Additions

Chunks of ontology

  1. for representing communication, which includes request, reponse, from/to and content of the communication. MU has some clear ideas abou this to be shared at a future date.
  2. ordering products is a special kind of request., link with FND products and services. 



Definition: Specifies the market domain in which a product is offered.  This is a superclass of LoanMarketCategory which is: specifies the market domain in which the loan product is offered. 


A subclass of oc:Occurrence that means the event of determining the risk of something. For loans, we have a subclass called CreditRiskAssessment, which entails among other things, getting a credit report.



For things like credit reports. A Product that is informational in nature, rather than physical.



There needs to be a way to spell out details of an address, city, street etc, ideally beyond just a string. Cities and zip codes are real things.



should be functional (or isIdentifiedBy inverse functional).


To be in alignment or agreement or obeying some kind of specification, e.g. terms in a master agreement. Also policies, conditions, guidelines, a recipe.

hasCreationDate (make it a subproperty of hasStartDate)

For reports, contracts, and many other things.

asOfDate a subproperty of hasDate

Used for credit reports.  Not necessarily the same as creation date, which could be later.
ALSO: ctr:effectiveDate should probably be a subproperty of asOfDate, since it means effective "as of" a given date.



Relates a party to the party for whom the are doing something.  E.g a point of contact is acting as such on behalf of a company. It might be this is quite general for FND, or one might want it in BE?


datatype property for version indicator

hasVersion string valued.