【问题标题】:finding common superclass and length of path in class hierarchies在类层次结构中找到共同的超类和路径长度
【发布时间】:2013-10-30 11:02:03
【问题描述】:

我有两个班级,A 和 B,来自 DBpedia。如何计算每个类到公共超类 C 的距离(边数),如何找到这个公共超类?

【问题讨论】:

    标签: rdf sparql owl dbpedia


    【解决方案1】:

    您可以这样做,但首先应注意以下几点:

    1. 两个类可能有很多共同的超类,不一定只有一个。这意味着可能没有唯一的最专业的通用超类。
    2. 如果某个类 C 是 A 和 B 的超类,则 C 的每个超类也是 A 和 B 的超类。
    3. A 类 D 可能是 C 的多个路径的超类,如果您尝试计算长度,这可能会导致一些困难。例如,

      Computer Hardware
        Monitors
          Flatscreen Monitors
            Dell Flatscreen Monitors  *
        Dell Hardware
          Dell Flatscreen Monitors    *
      

      在此层次结构中,戴尔平板显示器是计算机硬件的子类,路径长度为 2(DFM → DH → CH),路径长度为 3(DFM → FM → M →CH)。这很好,但是如果您要计算从 DFM 到另一个 CH 子类的长度,您应该使用哪一个?

    4. 数据中可能没有任何常见的超类。这也是一个完全合法的情况。现在,在 OWL 中,每个类都是 owl:Thing 的子类,但这通常不适用于 RDF,您甚至可能无法从 DBpedia 获得该结果,因为没有附加 OWL 推理器.

    假设您可以计算出解决这些问题所需的详细信息,这并不太难。在我看来,一步一步构建这个查询是最简单的。首先,使用这样的查询,您可以获得一个类的超类,以及每个超类的路径长度。这确实假定从子类到超类的唯一路径。如果有多个路径,我认为报告的长度将是不同路径的总和。我不知道你怎么能解决这个问题。

    select ?sub ?super (count(?mid) as ?length) where {
      values ?sub { dbpedia-owl:Person } 
      ?sub rdfs:subClassOf* ?mid .
      ?mid rdfs:subClassOf+ ?super .
    }
    group by ?sub ?super
    

    SPARQL results

    sub                                super                               length
    http://dbpedia.org/ontology/Person http://dbpedia.org/ontology/Agent   1
    http://dbpedia.org/ontology/Person http://www.w3.org/2002/07/owl#Thing 2
    

    现在的诀窍是对两个子类都使用这种方法,然后根据它们共有的超类连接结果,使用如下查询:

    select * 
    {
      values (?a ?b) { (dbpedia-owl:Person dbpedia-owl:SportsTeam) }
    
      { select ?a ?super (count(?mid) as ?aLength) { 
          ?a rdfs:subClassOf* ?mid .
          ?mid rdfs:subClassOf+ ?super .
        }
        group by ?a ?super
      }
      { select ?b ?super (count(?mid) as ?bLength) { 
          ?b rdfs:subClassOf* ?mid .
          ?mid rdfs:subClassOf+ ?super .
        }
        group by ?b ?super
      }
    }
    

    SPARQL results

    该查询仍然找到 所有 常见超类的路径长度,而不仅仅是最具体的超类,它仍然没有添加从 ?a?super 的长度和从 @987654335 的长度@ 到 ?super 以获取完整路径长度。不过,这只是一点算术。您可以按长度对这些结果进行排序,然后限制为一个结果,以便获得最短的结果。正如我所指出的,可能没有唯一的最具体的公共子类,但最短长度的结果将是最具体的公共子类中的一个

    select ?a ?b ?super (?aLength + ?bLength as ?length)
    {
      values (?a ?b) { (dbpedia-owl:Person dbpedia-owl:SportsTeam) }
    
      { select ?a ?super (count(?mid) as ?aLength) { 
          ?a rdfs:subClassOf* ?mid .
          ?mid rdfs:subClassOf+ ?super .
        }
        group by ?a ?super
      }
      { select ?b ?super (count(?mid) as ?bLength) { 
          ?b rdfs:subClassOf* ?mid .
          ?mid rdfs:subClassOf+ ?super .
        }
        group by ?b ?super
      }
    }
    order by ?length
    limit 1
    

    SPARQL results

    a      b          super length
    Person SportsTeam Agent 3
    

    【讨论】:

    • 我想要第一个公共超类!
    • @user2837896 我现在将查询放在一起,但请注意,可能没有一个最具体的通用超类。可以有多个最具体的超类。
    • 我明白了。但是,如果这些类被不同的命名空间引用,我该如何计算呢?例如dbpedia.org/ontology/NameOfTheClass_Adbpedia.org/class/yago/NameOfTheClass_B ?
    • 命名空间与它没有任何关系。 predefined namespace declarations 允许您将 yago:PeopleFromSantiago 写成一个,dbpedia-owl:Writer 写成另一个。
    • @user2837896 我当然可以理解为什么你会期望有个人同时是两者的成员,但是为什么需要有任何超类呢? DBpedia 类来自this ontology。 Yago 类和层次结构被定义为有助于与 Yago 词汇表的互操作性。没有理由假设有人在两个层次结构的类之间添加了rdfs:subClassOf 链接。确实,这是一件非常困难的事情,因为类定义可能非常微妙。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    相关资源
    最近更新 更多