为rdf:type打印多个值

时间:2014-07-31 15:49:23

标签: rdf sparql owl rdfs

我创建了一个类Asset,它是http://schema.org/CreativeWork的子类 资产有2个子类说文章和出版物

现在我只有Article或Publication类的实例。 资产是抽象类。

当我打印文章或出版物的元数据时我也是 想要打印资产的类型。在这种情况下,它将是文章或出版物。

我运行以下查询

SELECT ?id ?title ?type
WHERE
{
   ?asset rdf:type Asset ;
          somePrefix:id ?id ;
          somePrefix:title ?title ;
          rdf:type ?type .
}

现在,不是为每个Asset打印类型为Article或Publication,而是在rdf:type中获取多个值。 实施例

 id  title                    Type
 1   this is a article        CreativeWork
 1   this is a article        Asset
 1   this is a article        Article
 2   this is a publication    CreativeWork
 2   this is a publication    Asset
 2   this is a publication    Article

我想以某种方式在类型列

中仅打印文章或出版物

我怎样才能实现这个目标?

2 个答案:

答案 0 :(得分:3)

据我了解,您的班级层次结构为:

CreativeWork
  Asset
    Article
    Publication

您有几个选择。

除了文章和出版物之外什么都没有

最简单的说,您只想考虑文章和出版物的?类型的值,在这种情况下,您可以使用指定它:

SELECT ?id ?title ?type
WHERE
{
   values ?type { Article Publication }
   ?asset rdf:type Asset ;
          somePrefix:id ?id ;
          somePrefix:title ?title ;
          rdf:type ?type .
}

这是您可以做的最具体的事情,并保证您的类型只是文章或出版物。

获取 CreativeWork和资产

之外的所有内容

当然,您可以稍后定义其他子类,并且您可能不希望每次执行此操作时都必须向块添加更多类型。您可以考虑简单地过滤掉CreativeWork和Asset,然后:

SELECT ?id ?title ?type
WHERE
{
   ?asset rdf:type Asset ;
          somePrefix:id ?id ;
          somePrefix:title ?title ;
          rdf:type ?type .
   filter ( ?type != Asset && ?type != CreativeWork )
}

您也可以使用以下内容进行过滤:

filter ( ?type NOT IN ( Asset, CreativeWork ) )

仅获取最大限度的特定类

这并不保证您可以拥有哪些类,但如果您以后添加文章或出版物的子类,例如,JournalArticle⊑文章,那么您将获得结果包括Article和JournalArticle,你可能不希望这样。您可能想要的是个人的“最具体”类别。也就是说,你想要一个人的C类,使得个人没有其他类型D⊑C。(注意其他是重要的,因为C⊑C 。)How to get Least common subsumer in ontology using SPARQL Query?中记录了一般性想法以及其他一些问题,但很容易重现这里的重要部分:

SELECT ?id ?title ?type
WHERE
{
   ?asset rdf:type Asset ;
          somePrefix:id ?id ;
          somePrefix:title ?title ;
          rdf:type ?type .

   filter not exists {                    # Don't take ?type as a result if
      ?asset rdf:type ?subtype .          # ?asset has some other ?subtype 
      ?subtype rdfs:subClassOf* ?type .   # that is a subclass of ?type 
      filter ( ?subtype != ?type )        # (other than ?type itself).
   }
}

这将使您获得个人拥有的层次结构中的“最深”类。如果您的个人是类的成员,那么这仍然可以返回多个结果,这两个类都不是另一个的子类。当然,在这种情况下,您可能仍然对所有结果感兴趣。

答案 1 :(得分:0)

您收到此输出,因为您的资产都是资产和CreativeWorks,它们也可以是文章或出版物。如果您只想打印Asset的子类,那么您可以使用以下查询来限制?type的值(与您的额外行相同):

SELECT ?id ?title ?type
WHERE
{
     ?asset rdf:type Asset ;
            somePrefix:id ?id ;
            somePrefix:title ?title ;
            rdf:type ?type .
     ?type rdfs:subClassOf Asset . 
}

其中rdfs http://www.w3.org/2000/01/rdf-schema# 的名称空间前缀。
这意味着?type应该只是Asset的子类。

实际上并不需要第一个限制(?asset rdf:type Asset),但为了清楚起见,我保留了它,因为您在初始查询中已经有了它。你可以安全地跳过它。