【问题标题】:How to query for cyclical relationships in an RDF graph?如何在 RDF 图中查询循环关系?
【发布时间】:2023-03-05 06:36:02
【问题描述】:

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

@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】:

这些总是一步循环吗?

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 
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-27
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 2017-04-28
    • 2018-10-02
    • 1970-01-01
    相关资源
    最近更新 更多