我已经创建了一个类资产,它是 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),但我保留清楚起见,因为您在初始查询中拥有它。你可以安全地跳过它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top