如何计算 SPARQL 中的引用?

Zac*_*del 1 rdf sparql virtuoso

我想找到这个查询返回的每个主题是另一个三元组的对象的次数。

我可以使用以下示例来选择我想要的所有内容,而无需计算我想要的数量。

SELECT DISTINCT
    ?subject
    ?displayId
    ?version
    ?name
    ?description
    ?type
WHERE {
    { ?subject a sbol2:ComponentDefinition } UNION 
    { ?subject a sbol2:ModuleDefinition } UNION 
    { ?subject a sbol2:Collection } UNION 
    { ?subject a sbol2:Sequence } UNION 
    { ?subject a sbol2:Model } .

    ?subject a ?type
    OPTIONAL { ?subject sbol2:displayId ?displayId . }
    OPTIONAL { ?subject sbol2:version ?version . }
    OPTIONAL { ?subject dcterms:title ?name . }
    OPTIONAL { ?subject dcterms:description ?description . }
}

LIMIT 50
Run Code Online (Sandbox Code Playgroud)

我可以添加以下条件以将我的查询限制为仅与示例对象相关的事物,在本例中为具有 URI 的对象<http://localhost:7777/public/test/U49845/1>

{ ?use sbol2:definition <http://localhost:7777/public/test/U49845/1> .    
    { ?subject sbol2:module ?use } UNION 
    { ?subject sbol2:component ?use } UNION 
    { ?subject sbol2:functionalComponent ?use } 
} UNION 
{ ?subject sbol2:model <http://localhost:7777/public/test/U49845/1> } UNION 
{ ?subject sbol2:sequence <http://localhost:7777/public/test/U49845/1> } .
Run Code Online (Sandbox Code Playgroud)

有没有办法获得第二个查询将为?subject第一个查询中的每个返回的项目数?

Jos*_*lor 5

一般清理

替代对象或主题

首先,注意这个联合

{ ?subject a sbol2:ComponentDefinition } UNION 
{ ?subject a sbol2:ModuleDefinition } UNION 
{ ?subject a sbol2:Collection } UNION 
{ ?subject a sbol2:Sequence } UNION 
{ ?subject a sbol2:Model } .
Run Code Online (Sandbox Code Playgroud)

使用可以更短:

values ?type { sbol2:ComponentDefinition sbol2:ModuleDefinition
               sbol2:Collection sbol2:Sequence sbol2:Model }
?subject a ?type
Run Code Online (Sandbox Code Playgroud)

替代属性

同样,如果您有一堆替代属性,只需使用属性路径。这个联盟

{ ?subject sbol2:module ?use } UNION 
{ ?subject sbol2:component ?use } UNION 
{ ?subject sbol2:functionalComponent ?use }
Run Code Online (Sandbox Code Playgroud)

相当于

?subject sbol2:module|sbol2:component|sbol2:functionalComponent ?use
Run Code Online (Sandbox Code Playgroud)

具体问题

因此,通过添加所需的group by将您提出的查询转换为合法的 SPARQL ,您最终会得到:

SELECT DISTINCT
    ?subject ?displayId ?version ?name ?description ?type
    (COUNT(DISTINCT ?user) as ?uses)
WHERE {
    #-- Find users of the subject.  
    ?user ((sbol2:module|sbol2:component|sbol2:functionalComponent)
            /sbol2:definition)|sbol2:model|sbol2:sequence ?subject .

    #-- Find subjects
    values ?stype { sbol2:ComponentDefinition sbol2:ModuleDefinition
                   sbol2:Collection sbol2:Sequence sbol2:Model }
    ?subject a ?stype .

    #-- Find other types and properties of the ?subject
    ?subject a ?type .
    OPTIONAL { ?subject sbol2:displayId ?displayId . }
    OPTIONAL { ?subject sbol2:version ?version . }
    OPTIONAL { ?subject dcterms:title ?name . }
    OPTIONAL { ?subject dcterms:description ?description . }
}
GROUP BY ?subject ?displayId ?version ?name ?description ?type
ORDER BY DESC(?uses)
Run Code Online (Sandbox Code Playgroud)