我具有以下包含依赖项信息的服务的示例图:
@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中是否存在更自然的方法?
谢谢!
这些总是单步循环吗?
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
}