【问题标题】:SPARQL select query with condition?带条件的 SPARQL 选择查询?
【发布时间】:2016-06-21 10:40:43
【问题描述】:

我正在尝试形成 SPARQL 查询,该查询将针对来自 RDF 下方的给定 Java 类提供域名和方法名称。例如

选择域名、方法名,其中 JavaClass = 'MyJavaClass'。 这只是一个伪查询。我需要帮助在 SPARQL 中形成类似的查询。谢谢。

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:DOL="http://www.MyOnt.com/something/v1#"
    xmlns:DC="http://purl.org/dc/dcmitype/"
    xmlns:foaf="http://xmlns.com/foaf/0.1/">
  <rdf:Description rdf:about="http://www.MyOnt.com/something/data/MyJavaClass">
    <DOL:belongsTo>
      <rdf:Description rdf:about="http://www.MyOnt.com/something/data/MyDomain">
        <DOL:domainName>MyDomainValue2</DOL:domainName>
        <DOL:domainName>MyDomainValue</DOL:domainName>
      </rdf:Description>
    </DOL:belongsTo>
    <DOL:hasMethod>
      <rdf:Description rdf:about="http://www.MyOnt.com/something/data/MyMethod">
        <DOL:returnType>MethodReturnType</DOL:returnType>
      </rdf:Description>
    </DOL:hasMethod>
    <foaf:name>MyJavaClass</foaf:name>
  </rdf:Description>
</rdf:RDF>

【问题讨论】:

    标签: sparql rdf semantic-web ontology virtuoso


    【解决方案1】:

    如果您首先将数据放入 Turtle(其语法与 SPARQL 非常相似),通常更容易理解 SPARQL 查询应该是什么样子。以下是您在 Turtle 中的数据:

    @prefix DOL:   <http://www.MyOnt.com/something/v1#> .
    @prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
    @prefix foaf:  <http://xmlns.com/foaf/0.1/> .
    @prefix DC:    <http://purl.org/dc/dcmitype/> .
    
    <http://www.MyOnt.com/something/data/MyDomain>
            DOL:domainName  "MyDomainValue2" , "MyDomainValue" .
    
    <http://www.MyOnt.com/something/data/MyJavaClass>
            DOL:belongsTo  <http://www.MyOnt.com/something/data/MyDomain> ;
            DOL:hasMethod  <http://www.MyOnt.com/something/data/MyMethod> ;
            foaf:name      "MyJavaClass" .
    
    <http://www.MyOnt.com/something/data/MyMethod>
            DOL:returnType  "MethodReturnType" .
    

    完成此操作后,查询看起来几乎与数据完全相同,只是其中包含变量。这里唯一要注意的是,由于您要查找域和方法,因此需要使用 union(假设您要将域和方法绑定为不同的变量)。

    prefix DOL:   <http://www.MyOnt.com/something/v1#>
    prefix foaf:  <http://xmlns.com/foaf/0.1/>
    
    select ?domain ?method {
      ?class foaf:name "MyJavaClass" .
      { ?class DOL:belongsTo ?domain }
      union
      { ?class DOL:hasMethod ?method }
    }
    
    ---------------------------------------------------------------------------------------------------
    | domain                                         | method                                         |
    ===================================================================================================
    | <http://www.MyOnt.com/something/data/MyDomain> |                                                |
    |                                                | <http://www.MyOnt.com/something/data/MyMethod> |
    ---------------------------------------------------------------------------------------------------
    

    如果您愿意将域和方法绑定到同一个变量,则可以使用替代属性路径来选择任一域或方法:

    prefix DOL:   <http://www.MyOnt.com/something/v1#>
    prefix foaf:  <http://xmlns.com/foaf/0.1/>
    
    select ?domainOrMethod {
      ?class foaf:name "MyJavaClass" ;
             DOL:belongsTo|DOL:hasMethod ?domainOrMethod 
    }
    
    --------------------------------------------------
    | domainOrMethod                                 |
    ==================================================
    | <http://www.MyOnt.com/something/data/MyDomain> |
    | <http://www.MyOnt.com/something/data/MyMethod> |
    --------------------------------------------------
    

    作为另一种选择,您可以使用 values 块来指定要遵循的属性(hasMethodbelongsTo),在在这种情况下,您也可以选择它以了解您拥有哪种类型的值:

    prefix DOL:   <http://www.MyOnt.com/something/v1#>
    prefix foaf:  <http://xmlns.com/foaf/0.1/>
    
    select ?property ?value {
      values ?property { DOL:belongsTo DOL:hasMethod }
      ?class foaf:name "MyJavaClass" ;
             ?property ?value  
    }
    
    ------------------------------------------------------------------
    | property      | value                                          |
    ==================================================================
    | DOL:belongsTo | <http://www.MyOnt.com/something/data/MyDomain> |
    | DOL:hasMethod | <http://www.MyOnt.com/something/data/MyMethod> |
    ------------------------------------------------------------------
    

    【讨论】:

    • 我看到的问题主要是这里的许多人并没有尝试首先学习或理解至少一些 SPARQL 基础知识。这是你的努力和伟大的工作,但我认为下一个查询不能由他们自己编写。
    • @Joshua:感谢您的详细解释。它确实有很大帮助。我的目标是显示域值以及返回类型。我已经修改了您的查询并获得了所需的结果。事实上,我保持您的查询不变,并添加了另外两个变量“dValues”和“rType”。它工作正常,但我只是不明白我必须为上述两个变量使用不同的变量:这是代码 sn-p 之一:{ ?class2 DOL:domainName ?dValues } 当我使用“class2”但不使用时它可以工作与“类”一起工作。看起来“类”已经定义了,这会发生冲突吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 2022-08-07
    • 2017-11-08
    • 1970-01-01
    相关资源
    最近更新 更多