schema.org contains a bunch of anonymous classes like the union of other
classes which are used as domain or range of a property, that's why you
get null values because they do not have a URI. If you'd just call 

|System.out.println(clazz);|


you'd see the blank node Ids.


Among all those blank nodes, there is indeed the one top level class
http://schema.org/Thing .


I thought just adding a filter on the iterator is enough, i.e.

|topClazzez = topClazzez.filterDrop(OntResource::isAnon);|


but while it doesn't return the blank nodes anymore, it leads to an
exception:


|Exception in thread "main"
org.apache.jena.ontology.ConversionException: Cannot convert node
http://www.w3.org/2000/01/rdf-schema#Class to OntClass: it does not have
rdf:type owl:Class or equivalent||
||    at
org.apache.jena.ontology.impl.OntClassImpl$1.wrap(OntClassImpl.java:82)||
||    at org.apache.jena.enhanced.EnhNode.convertTo(EnhNode.java:152)||
||    at org.apache.jena.enhanced.EnhNode.convertTo(EnhNode.java:31)||
||    at
org.apache.jena.enhanced.Polymorphic.asInternal(Polymorphic.java:62)||
||    at org.apache.jena.enhanced.EnhNode.as(EnhNode.java:107)||
||    at
org.apache.jena.ontology.impl.OntResourceImpl.lambda$listDirectPropertyValues$8(OntResourceImpl.java:1536)||
||    at
org.apache.jena.util.iterator.Map1Iterator.next(Map1Iterator.java:46)||
||    at
org.apache.jena.ontology.impl.OntResourceImpl.computeDirectValues(OntResourceImpl.java:1580)||
||    at
org.apache.jena.ontology.impl.OntResourceImpl.listDirectPropertyValues(OntResourceImpl.java:1553)||
||    at
org.apache.jena.ontology.impl.OntClassImpl.listSuperClasses(OntClassImpl.java:180)||
||    at
org.apache.jena.ontology.impl.OntClassImpl.isHierarchyRoot(OntClassImpl.java:739)||
||    at
org.apache.jena.util.iterator.FilterIterator.hasNext(FilterIterator.java:56)||
||    at
org.apache.jena.util.iterator.WrappedIterator.hasNext(WrappedIterator.java:90)||
||    at
org.apache.jena.util.iterator.FilterIterator.hasNext(FilterIterator.java:55)||
||    at com.company.Main.main(Main.java:25)|



On 05.09.19 03:11, Alex To wrote:
> Hi I am trying to load schema.org ontology and get all top classes
> using ontModel.listHierarchyRootClasses() but can't get the expected
> results with different OntModelSpec.
>
> If I use OWL_MEM, it lists 2500+ records with all the records have "null"
> URI.
> If I use OWL_DL_MEM, it lists 0 records
>
> The code is very simple as follows
>
> Model model = ModelFactory.createDefaultModel();
> model.read("https://schema.org/docs/schemaorg.owl";);
> OntModel ontModel =
> ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM, model);
> ExtendedIterator<OntClass> topClazzez = ontModel.listHierarchyRootClasses();
> while (topClazzez.hasNext()) {
>     OntClass clazz = topClazzez.next();
>     System.out.println(clazz.getURI());
> }
>
> A minimal Maven project ready to run to demonstrate my problem is here
> https://github.com/AlexTo/jena-lab (have a look at the Main.java)
>
> Thanks a lot

Reply via email to