如何计算 SPARQL 中的引用?
How to count references in SPARQL?
我想知道这个查询 return 每个主题是另一个三元组的对象的次数。
我可以使用以下示例 select 我想要的一切,而不需要我想要的数量。
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
我可以添加以下条件以将我的查询限制为仅与示例对象相关的事物,在本例中为具有 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> } .
有没有办法获取第一个查询中每个 ?subject
的第二个查询 return 的项目数?
好吧,当我问这个问题时就明白了。对于任何好奇的人,这就是我修改查询的方式:
SELECT DISTINCT
?subject
?displayId
?version
?name
?description
?type
(COUNT(DISTINCT ?user) as ?uses)
WHERE {
{ ?use sbol2:definition ?subject .
{ ?user sbol2:module ?use } UNION
{ ?user sbol2:component ?use } UNION
{ ?user sbol2:functionalComponent ?use }
} UNION
{ ?user sbol2:model ?subject} UNION
{ ?user sbol2:sequence ?subject } .
{ ?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 . }
} ORDER BY DESC(?uses)
LIMIT 50
常规清理
替代对象或主题
首先,请注意这个 union block
{ ?subject a sbol2:ComponentDefinition } UNION
{ ?subject a sbol2:ModuleDefinition } UNION
{ ?subject a sbol2:Collection } UNION
{ ?subject a sbol2:Sequence } UNION
{ ?subject a sbol2:Model } .
使用 values:
可以更短
values ?type { sbol2:ComponentDefinition sbol2:ModuleDefinition
sbol2:Collection sbol2:Sequence sbol2:Model }
?subject a ?type
替代属性
同样,如果您有一堆替代属性,只需使用 属性 路径即可。这个联合:
{ ?subject sbol2:module ?use } UNION
{ ?subject sbol2:component ?use } UNION
{ ?subject sbol2:functionalComponent ?use }
等同于
?subject sbol2:module|sbol2:component|sbol2:functionalComponent ?use
具体问题
因此,通过添加所需的 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)
我想知道这个查询 return 每个主题是另一个三元组的对象的次数。
我可以使用以下示例 select 我想要的一切,而不需要我想要的数量。
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
我可以添加以下条件以将我的查询限制为仅与示例对象相关的事物,在本例中为具有 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> } .
有没有办法获取第一个查询中每个 ?subject
的第二个查询 return 的项目数?
好吧,当我问这个问题时就明白了。对于任何好奇的人,这就是我修改查询的方式:
SELECT DISTINCT
?subject
?displayId
?version
?name
?description
?type
(COUNT(DISTINCT ?user) as ?uses)
WHERE {
{ ?use sbol2:definition ?subject .
{ ?user sbol2:module ?use } UNION
{ ?user sbol2:component ?use } UNION
{ ?user sbol2:functionalComponent ?use }
} UNION
{ ?user sbol2:model ?subject} UNION
{ ?user sbol2:sequence ?subject } .
{ ?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 . }
} ORDER BY DESC(?uses)
LIMIT 50
常规清理
替代对象或主题
首先,请注意这个 union block
{ ?subject a sbol2:ComponentDefinition } UNION
{ ?subject a sbol2:ModuleDefinition } UNION
{ ?subject a sbol2:Collection } UNION
{ ?subject a sbol2:Sequence } UNION
{ ?subject a sbol2:Model } .
使用 values:
可以更短values ?type { sbol2:ComponentDefinition sbol2:ModuleDefinition
sbol2:Collection sbol2:Sequence sbol2:Model }
?subject a ?type
替代属性
同样,如果您有一堆替代属性,只需使用 属性 路径即可。这个联合:
{ ?subject sbol2:module ?use } UNION
{ ?subject sbol2:component ?use } UNION
{ ?subject sbol2:functionalComponent ?use }
等同于
?subject sbol2:module|sbol2:component|sbol2:functionalComponent ?use
具体问题
因此,通过添加所需的 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)