我正在寻找一种从概念的所有关系中获得关系的简单方法。例如: 您搜索名为“Abc”的概念。它与其他对象有某种关系,例如“D”,“Ef”,“Ghi”。结果如下:
------------------------------------------------------------------------------- | concept | relation | value | ===================================== | uri:Abc | skos:narrower | uri:D | | uri:Abc | skos:narrower | uri:Ef | | uri:Abc | skos:broader | uri:Ghi | -------------------------------------
所以现在你知道了“Abc”的关系。如果你想知道“Abc”关系中的关系,你可以使用一个subselect。如下面的查询。但我想要的是两个结果。我会知道“Abc”的关系,也会知道“D”,“Ef”,“Ghi”的关系。
SELECT (?v1 as ?concept) ?relation ?value WHERE
{
?v1 ?relation ?value .
{
SELECT ?c1 ?r1 ?v1 WHERE
{
?c1 rdf:label "Abc" .
?c1 ?r1 ?v1 .
}
}
}
这是我当前的查询。在制作中我使用了一个过滤器,但是对于这个例子来说没有必要。
答案 0 :(得分:1)
这里不需要子查询,我最初的尝试比实际需要的要复杂得多。如果你想要所有主题,谓词,对象三元组,其中主题是带有标签“Abc”的东西或它所连接的东西,你可以使用这个查询:
select ?s ?p ?o {
?c rdfs:label "Abc" .
?c (<>|!<>)? ?s .
?s ?p ?o .
}
?cddfs:标签“Abc”将?c 绑定到Abc对象,就像在查询中一样。然后?c(&lt;&gt; |!&lt;&gt;)? 使? ?c 或与之相关的某种关系。这是有效的,因为&lt;&gt; |!&lt;&gt; 是一个通配符(因为每个属性都是&lt;&gt; ,或者它不是,并且 ?表示零或一次出现。)
例如,使用此数据和查询,您将获得以下结果:
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
@prefix skos: <http://www.w3.org/2004/02/skos/core#>.
@prefix : <urn:ex:>.
:Abc rdfs:label "Abc" ;
skos:narrower :D, :Ef ;
skos:broader :Ghi .
:D skos:narrower :Da, :De, :Do .
:Ghi skos:narrower :Ginormous, :General .
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix skos: <http://www.w3.org/2004/02/skos/core#>
prefix : <urn:ex:>
select ?s ?p ?o {
?c rdfs:label "Abc" .
?c (<>|!<>)? ?s .
?s ?p ?o
}
-------------------------------------
| s | p | o |
=====================================
| :Ghi | skos:narrower | :General |
| :Ghi | skos:narrower | :Ginormous |
| :D | skos:narrower | :Do |
| :D | skos:narrower | :De |
| :D | skos:narrower | :Da |
| :Abc | skos:broader | :Ghi |
| :Abc | skos:narrower | :Ef |
| :Abc | skos:narrower | :D |
| :Abc | rdfs:label | "Abc" |
-------------------------------------
这个的构造版本(因为你基本上得到三倍)将是:
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix skos: <http://www.w3.org/2004/02/skos/core#>
prefix : <urn:ex:>
construct { ?s ?p ?o }
where {
?c rdfs:label "Abc" .
?c (<>|!<>)? ?s .
?s ?p ?o
}