我创建了一个类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
我想以某种方式在类型列
中仅打印文章或出版物我怎样才能实现这个目标?
答案 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和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
),但为了清楚起见,我保留了它,因为您在初始查询中已经有了它。你可以安全地跳过它。