2

我正在编写一个代码生成器,它从此处定义的模式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.ttl中的声明schema: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 接口来解析模式吗?

4

1 回答 1

3

请注意, listDeclaredProperties 上的文档是(添加了重点):

listDeclaredProperties

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

返回与此类的类似框架的视图关联的属性的迭代器。这捕获了类属性的直观概念。这对于在用户界面中呈现本体类很有用,例如通过自动构造一个表单来实例化类的实例。类的框架视图中的属性是通过将此类的 OntModel 中的属性域与类本身进行比较来确定的。有关详细信息,请参阅: 将 RDF 呈现为框架

请注意,确定属性是否与类关联的许多情况取决于 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>;

address的域是一个联合类:PersonPlaceOrganization这是Person的超类,但它是一个复杂的类表达式,而不仅仅是一个简单的命名类,因此您可能需要一个推理器,如文档所述,让 Jena 识别它是Person的超类。

与 OWL 语义的比较

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

在 OWL 中,类 D 是属性 P 的域意味着什么,只要我们有一个带有属性 P 的三元组,我们就可以推断出主语是一个 D。这可以用规则来表达

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

因此,即使Person可能有一个地址,仅仅因为某物有一个地址并不足以告诉我们该某物是一个Person;它仍然可以是PlaceOrganization

于 2014-04-02T14:22:27.427 回答