【问题标题】:How to count references in SPARQL?如何计算 SPARQL 中的引用?
【发布时间】:2017-08-07 04:37:40
【问题描述】:

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

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

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 返回的项目数?

【问题讨论】:

    标签: sparql rdf virtuoso


    【解决方案1】:

    常规清理

    另类的客体或主题

    首先,请注意这个 union

    { ?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)
    

    【讨论】:

      【解决方案2】:

      好的,当我问这个问题时就知道了。对于任何好奇的人,这就是我修改查询的方式:

      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
      

      【讨论】:

      • 虽然这个想法可能是正确的,但这是非标准的 SPARQL 语法,仅适用于 Virtuoso。除了?user之外的所有变量的GROUP BY
      • 嗯,很有趣。你能发布标准的 SPARQL 方法吗?
      • 只是添加GROUP BY ?subject ?displayId ...。原因是像count 这样的聚合函数是在组上计算的。通过使用sparql.org/query-validator.html,您可以看到您的查询不遵循 SPARQL 标准
      猜你喜欢
      • 2022-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多