代码之家  ›  专栏  ›  技术社区  ›  significance

探索性SPARQL查询?

  •  45
  • significance  · 技术社区  · 14 年前

    每当我开始使用SQL时,我都倾向于在数据库中抛出一些探索性语句,以了解什么是可用的,以及数据采用什么形式。

    如。

    show tables
    
    describe table
    
    select * from table
    

    有人能帮助我理解如何使用SPARQL端点完成对RDF数据存储的类似探索吗?

    谢谢)

    4 回复  |  直到 14 年前
        1
  •  75
  •   Ivo Velitchkov    5 年前

    显而易见的第一步是查看数据中存在的类和属性。

    以下是如何查看正在使用的类:

    SELECT DISTINCT ?class
    WHERE {
      ?s a ?class .
    }
    LIMIT 25
    OFFSET 0
    

    ( LIMIT OFFSET 有寻呼吗?尤其是当你通过互联网发送你的查询时,这些都是值得去适应的。我将在其他示例中省略它们。)

    a 是一种特殊的SPARQL(和 Notation3 / Turtle )语法来表示 rdf:type 谓词-将单个实例链接到 owl:Class / rdfs:Class 类型(大致相当于SQL RDBMSE中的表)。

    第二,你想看看这些属性。您可以通过使用已经搜索过的类或只是查找属性来实现这一点。让我们把所有的财产从商店里拿出来:

    SELECT DISTINCT ?property
    WHERE {
      ?s ?property ?o .
    }
    

    这将得到您可能不感兴趣的所有属性。这相当于SQL中所有行列的列表,但不按表分组。

    更有用的是查看声明特定类的实例正在使用哪些属性:

    SELECT DISTINCT ?property
    WHERE {
      ?s a <http://xmlns.com/foaf/0.1/Person>;
         ?property ?o .
    }
    

    这将使您返回满足前三个条件的任何实例上使用的属性,即 RDF:类型 属于 http://xmlns.com/foaf/0.1/Person .

    记住,因为一个rdf:resource可以有多个rdf:type属性(如果愿意的话,可以是类),而且因为rdf的数据模型是可加的,所以没有菱形问题。这种类型只是另一种属性——说有些东西是人、狗、基因或足球队,这只是一种有用的社会协议。这并不意味着数据存储将包含通常与该类型关联的属性。在资源可能具有的属性方面,类型不保证任何内容。

    您需要熟悉数据模型以及SPARQL联合和可选语法的使用。RDF:type到SQL表的粗略映射就是这样的-粗略的。

    您可能想知道属性指向的是哪种实体。首先,您可能想知道数据类型属性-相当于文本或原语。您知道,字符串、整数等。RDF将这些文本定义为所有从字符串继承的文本。我们可以使用SPARQL过滤方法过滤掉那些文本属性。 isLiteral :

    SELECT DISTINCT ?property
    WHERE {
      ?s a <http://xmlns.com/foaf/0.1/Person>;
         ?property ?o .
      FILTER isLiteral(?o)
    }
    

    我们在这里只会得到作为其对象的属性——字符串、日期时间、布尔值或其他XSD数据类型之一。

    但是非文字对象呢?把这个非常简单的伪Java类定义当作一个类比:

    public class Person {
        int age;
        Person marriedTo;
    }
    

    使用上面的查询,如果Age属性被绑定,我们将返回表示Age的文本。但marriedto并不是一个原语(即RDF术语中的文字),它是对另一个对象的引用,在RDF/OWL术语中,它是一个对象属性。但是我们不知道这些属性(谓词)所引用的对象是什么类型的。此查询将返回带有附带类型(其类 ?o 值是的成员)。

    SELECT DISTINCT ?property, ?class
    WHERE {
      ?s a <http://xmlns.com/foaf/0.1/Person>;
         ?property ?o .
      ?o a ?class .
      FILTER(!isLiteral(?o))
    }
    

    这应该足以在特定的数据集中确定您自己的方向。当然,我也建议你拿出一些个人资源来检查一下。您可以使用描述查询:

    DESCRIBE <http://example.org/resource>
    

    有一些SPARQL工具- SNORQL 例如,它允许您在浏览器中执行此操作。我链接到的Snorql实例有一个用于探索可能命名图的示例查询,我在这里没有介绍。

    如果您不熟悉SPARQL,老实说,如果您陷入困境,最好的资源就是规范。这是一个W3C规范,但非常好(他们构建了一个很好的测试套件,这样您就可以实际查看实现是否正确地完成了它),而且如果您能够克服复杂的语言,它将非常有用。

        2
  •  7
  •   marc_s    8 年前

    我发现以下一组探索性查询很有用:

    观看课程:

    select distinct ?type ?label 
    where { 
        ?s a ?type . 
        OPTIONAL { ?type rdfs:label ?label } 
    }
    

    查看属性:

    select distinct ?objprop ?label 
    where { 
        ?objprop a owl:ObjectProperty . 
        OPTIONAL { ?objprop rdfs:label ?label } 
    }
    

    查看数据属性:

    select distinct ?dataprop ?label 
    where { 
        ?dataprop a owl:DatatypeProperty . 
        OPTIONAL { ?dataprop rdfs:label ?label } 
    }
    

    查看实际使用的属性:

    select distinct ?p ?label 
    where { 
        ?s ?p ?o . 
        OPTIONAL { ?p rdfs:label ?label } 
    }
    

    查看断言的实体:

    select distinct ?entity ?elabel ?type ?tlabel 
    where { 
        ?entity a ?type . 
        OPTIONAL { ?entity rdfs:label ?elabel } . 
        OPTIONAL { ?type rdfs:label ?tlabel } 
    }
    

    查看使用中的不同图形:

    select distinct ?g where { 
        graph ?g { 
            ?s ?p ?o 
        } 
    }
    
        3
  •  2
  •   Delimitry COLD TOLD    8 年前
    SELECT DISTINCT * WHERE {
      ?s ?p ?o
    }
    LIMIT 10
    
        4
  •  1
  •   Thomas Kappler    14 年前

    我经常提到这个 list of queries from the voiD project . 它们主要是统计性质的,但不仅如此。从一些语句中删除计数以获取实际值应该不难。