如何在RDF图中查询循环关系?

问题描述 投票:0回答:1

我具有以下包含依赖项信息的服务的示例图:

@base <https://meta.acme.com/> .
@prefix : <http://schema.meta.acme.com/> .
@prefix dc: <http://purl.org/dc/terms/> .

</service/c84acffd-944a-43c1-8f06-956a4a6033da>
  a :Service ;
  dc:title "Service 1" ;
  :serviceDependency 
    </service/70987802-9157-4881-ab0c-049b04b7798d>, 
    </service/2b47109e-26e3-4d06-b245-98730bdb7d43>.

</service/70987802-9157-4881-ab0c-049b04b7798d>
  a :Service ;
  dc:title "Service 2" ;
  :serviceDependency 
    </service/c84acffd-944a-43c1-8f06-956a4a6033da>, 
    </service/f45b998c-b496-4318-be40-46c1aafaf6cd> .

</service/2b47109e-26e3-4d06-b245-98730bdb7d43>
  a :Service ;
  dc:title "Service 3" ;
  :serviceDependency </service/> .

</service/f45b998c-b496-4318-be40-46c1aafaf6cd>
  a :Service ;
  dc:title "Service 4" ;
  :serviceDependency </service/> .

我正在编写SPARQL查询以查找依赖关系中的循环。我有一个查询会产生正确的结果,但是会产生伪重复。

例如:

prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix c: <http://schema.meta.acme.com/>
prefix dc: <http://purl.org/dc/terms/>

select ?a ?aname ?b ?bname
where 
{ 
  {
      ?a a c:Service ;
        dc:title ?aname ;
        c:serviceDependency ?b .

      ?b dc:title ?bname .

  } filter ( EXISTS { ?b c:serviceDependency ?a } )
}

产生以下输出:

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| a                                                                    | aname       | b                                                                    | bname       |
===========================================================================================================================================================================
| <https://meta.acme.com/service/70987802-9157-4881-ab0c-049b04b7798d> | "Service 2" | <https://meta.acme.com/service/c84acffd-944a-43c1-8f06-956a4a6033da> | "Service 1" |
| <https://meta.acme.com/service/c84acffd-944a-43c1-8f06-956a4a6033da> | "Service 1" | <https://meta.acme.com/service/70987802-9157-4881-ab0c-049b04b7798d> | "Service 2" |
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

同样,这是预期的-但是,我希望查询反映的信息是周期本身,而不是周期的双方。

我的解决方法是通过对2个ID进行排序和连接,然后按这些ID进行分组来计算标识符,但是我想问问SPARQL中是否存在更自然的方法?

谢谢!

sparql rdf semantic-web
1个回答
0
投票

这些总是单步循环吗?

prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix c: <http://schema.meta.acme.com/>
prefix dc: <http://purl.org/dc/terms/>

select ?a ?aname ?b ?bname
where 
  {
    ?a a                   c:Service ;
       dc:title            ?aname ;
       c:serviceDependency ?b .

    ?b dc:title            ?bname ;
       c:serviceDependency ?a 
  }
© www.soinside.com 2019 - 2024. All rights reserved.