使用Jena解析schema.org ttl / owl文件

时间:2014-04-01 21:40:34

标签: rdf jena ontology schema.org rdfs

我正在编写一个代码生成器,它从这里定义的模式http://schema.rdfs.org/all.ttl生成实体(Java语言中的POJO)。我正在使用Jena解析ttl文件并检索生成它们所需的元数据。

Jena成功解析了文件,但由于某种原因,它没有列出给定实体的所有属性,例如Person。我不确定我是否做错了,使用错误的API等。这是重新创建场景的代码示例:

    public class PersonParser {

    public static void main(String[] args) {
        OntModel model = ModelFactory.createOntologyModel();
        URL url = Thread.currentThread().getContextClassLoader().getResource("schema_org.ttl");
        model.read(url.toString(), "TURTLE");
        OntClass ontclass = model.getOntClass("http://schema.org/Person");
        Iterator<OntProperty> props = ontclass.listDeclaredProperties();
        while (props.hasNext()) {
            OntProperty p = props.next();
            System.out.println("p:" + p.getLocalName());
        }
    }
}

基本上,我只找一个名为Person的类,并试图列出它的所有属性,我得到的是:

p:alternateName
p:deathDate
p:alumniOf
p:sameAs
p:url
p:additionalName
p:homeLocation
p:description
p:nationality
p:sibling
p:follows
p:siblings
p:colleagues
p:memberOf
p:knows
p:name
p:gender
p:birthDate
p:children
p:familyName
p:jobTitle
p:workLocation
p:parents
p:affiliation
p:givenName
p:honorificPrefix
p:parent
p:colleague
p:additionalType
p:honorificSuffix
p:image
p:worksFor
p:relatedTo
p:spouse
p:performerIn

但是如果你看一下http://schema.org/Person,就会有一堆未列出的属性(例如address)。 http://schema.rdfs.org/all.ttlschema:address的声明是:

schema:address a rdf:Property;
    rdfs:label "Address"@en;
    rdfs:comment "Physical address of the item."@en;
    rdfs:domain [ a owl:Class; owl:unionOf (schema:Person schema:Place schema:Organization) ];
    rdfs:range schema:PostalAddress;
    rdfs:isDefinedBy <http://schema.org/Person>;
    rdfs:isDefinedBy <http://schema.org/Place>;
    rdfs:isDefinedBy <http://schema.org/Organization>;
    .

有没有人碰到过这个?我应该使用不同的Jena界面来解析架构吗?

1 个答案:

答案 0 :(得分:3)

请注意,listDeclaredProperties上的文档是(强调添加):

  

listDeclaredProperties

com.hp.hpl.jena.util.iterator.ExtendedIterator<OntProperty> listDeclaredProperties(boolean direct)
     

在与框架相关联的属性上返回迭代器   这个班级的看法。这捕获了一个直观的概念   一个类的属性。这在呈现本体时很有用   用户界面中的类,例如通过自动构造一个   用于实例化类实例的表单。中的属性   类的框架式视图是通过比较域的确定的   此类的OntModel中的属性与类本身。看到:   Presenting RDF as frames了解更多详情。

     

请注意,很多情况都是确定属性是否相关联   一个类取决于RDFS或OWL推理。这种方法可以   因此,仅在附加的模型中返回完整的结果   推理。

     

参数:

     
      
  • direct - 如果为true,则将返回的属性限制为与此类直接关联的属性。如果为false,则为超类的属性   此类的声明属性中不会列出此类   类。
  •   
     

返回:

     

通过其域与此类关联的属性的迭代。

因此,即使在查看特定模式之前,重要的是要注意除非您使用推理器,否则您可能无法获得所期望的所有结果。然后,注意如何声明地址属性:

schema:address a rdf:Property;
    rdfs:label "Address"@en;
    rdfs:comment "Physical address of the item."@en;
    rdfs:domain [ a owl:Class; owl:unionOf (schema:Person schema:Place schema:Organization) ];
    rdfs:range schema:PostalAddress;
    rdfs:isDefinedBy <http://schema.org/Person>;
    rdfs:isDefinedBy <http://schema.org/Place>;
    rdfs:isDefinedBy <http://schema.org/Organization>;

地址的域名是一个联合类:放置组织。这是 Person 的超类,但它是一个复杂的类表达式,而不仅仅是一个简单的命名类,所以你可能需要一个推理器,正如文档所提到的那样,让Jena认识到它是一个超类

与OWL语义的比较

我认为使用推理器将允许Jena识别地址的域是 Person 的超类,因此将其包含在listDeclaredProperties的结果中。值得注意的是,这与OWL语义有何不同。

在OWL中,D类作为属性P的域意味着每当我们拥有属性P的三元组时,我们就可以推断出主语是D.这可以用规则来表达

P rdfs:domain D     X P Y
-------------------------
    X rdf:type D

所以,即使 Person 可能有一个地址,只是因为某些东西有一个地址不足以告诉我们那个某事;它仍然可以是 Place Organization