题
我已经创建了一个类资产,它是 http://schema.org/creativeworks 资产有2个子类发表文章和出版物
现在我将有只有物品或出版类的实例。 资产是抽象类。
当我打印物品或出版物的元数据 想要打印资产类型。在这种情况下,它将是物品或出版物。
我运行以下Query
SELECT ?id ?title ?type
WHERE
{
?asset rdf:type Asset ;
somePrefix:id ?id ;
somePrefix:title ?title ;
rdf:type ?type .
}
.
现在而不是打印类型作为文章或发布每个资产,我在RDF中获得多个值:类型。 示例
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
.
我想要在某种程度上只打印文章或在类型列中发布
如何实现这一目标?
解决方案
我理解你,你的类层次结构是:
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和资产,然后:
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 ) )
.
只获取最大特定的类
这不会对您的类别进行任何课程,而且如果您稍后添加文章或出版物的子类,例如journadticle⊑文章,那么您将获得结果包括文章和杂志,你可能不想要那个。你可能想要什么,是个人的“最具体的”课程。也就是说,您希望个人的C类,使得个人没有其他类型D⊑C。(请注意,其他很重要,因为C≠C. 。)通过SPARQL查询,在中捕获的一般想法是如何使用sparql查询的,但很容易重现在此处的重要部分:
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).
}
}
.
这将在个人拥有的层次结构中获得“最深的”类。如果您的个人是类别的成员,这仍然可以返回多个结果,这两者也不是另一个子类。当然,在这种情况下,你可能仍然对所有结果感兴趣。
其他提示
您正在获得此输出,因为您的资产是所有资产和创意工作,而且它们也可以是文章或出版物。如果您只想打印资产的子类,那么您可以使用以下查询限制生成的值(与额外行相同):
SELECT ?id ?title ?type
WHERE
{
?asset rdf:type Asset ;
somePrefix:id ?id ;
somePrefix:title ?title ;
rdf:type ?type .
?type rdfs:subClassOf Asset .
}
.
其中?type
是 http://www.w3的命名空间前缀.org / 2000/01 / rdf-schema# 。
这意味着rdfs
应该是资产的子类。
实际上不是实际需要的第一个限制(?type
),但我保留清楚起见,因为您在初始查询中拥有它。你可以安全地跳过它。