DBpedia 中的 SPARQL 子查询

SPARQL subquery in DBpedia

我想筛选在查询中用作 "join" 的资源。 例如,给定一个 DBpedia 资源,我需要 return 由 sameAs 属性 链接的资源标签,并且在其 URI 中有 "pt"。我正在使用以下查询:

SELECT ?label
{ <http://dbpedia.org/resource/Category:Algorithms> owl:sameAs ?nomePT.
   ?nomePT rdfs:label ?label
    FILTER regex(str(?nomePT), "pt", "i") 
}

但是,它 return 是空的,因为变量“?NomePT”始终包含列表中的第一个资源。见:

SELECT ?nomePT
{ <http://dbpedia.org/resource/Category:Algorithms> owl:sameAs ?nomePT.
   ?nomePT rdfs:label ?label
}

但是该资源有几个相同的链接:

SELECT ?nomePT
{ <http://dbpedia.org/resource/Category:Algorithms> owl:sameAs ?nomePT.}

查询有什么问题?

提前致谢。

如果您编写查询:

SELECT distinct * {
    ?nomePT owl:sameAs category:Algorithms.
}

您将获得所有 owl:sameAs 您的资源 category:Algorithms 的链接。但是,您已经限制了三元组的范围。所以如果你要求:

SELECT distinct ?nomePT {
    ?nomePT owl:sameAs category:Algorithms.
    ?nomePT rdfs:label ?label
}

如果首先找到您的特定资源,然后仅查找该资源的标签。但是,如果您不在开始时绑定您的三元组并且只过滤您的资源将为您提供您需要的所有链接:

SELECT distinct ?resource {
    ?nomePT owl:sameAs ?resource.
    ?nomePT rdfs:label ?label.
filter( ?nomePT=category:Algorithms )
}

因此,您应该首先找到所有资源,然后根据特定资源(例如 category:Algorithms 过滤它们,因为 sameAs 是自反的:

SELECT distinct * {
    ?nomePT owl:sameAs ?resource.
    ?nomePT rdfs:label ?label.
filter( ?nomePT=category:Algorithms && regex(str(?resource), "pt", "i") )
}