SPARQLSyntax

SPARQL 1.1 解析器和抽象语法

特性

构建

% swift build -c release

Swift 包管理器

要将 SPARQLSyntax 用于使用 Swift 包管理器的项目,请将以下内容添加到项目的 Package.swift 文件中

dependencies: [
  .package(url: "https://github.com/kasei/swift-sparql-syntax.git", .upToNextMinor(from: "0.0.91"))
]

命令行用法

提供了一个命令行工具 sparql-parser,用于解析 SPARQL 查询并打印其解析后的查询代数、分词或美化打印的 SPARQL 字符串

% ./.build/release/sparql-parser 
Usage: ./.build/release/sparql-parser [-v] COMMAND [ARGUMENTS]
       ./.build/release/sparql-parser parse query.rq
       ./.build/release/sparql-parser lint query.rq
       ./.build/release/sparql-parser tokens query.rq

要“检查”或“美化打印” SPARQL 查询

% cat examples/messy.rq
prefix geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
select    ?s
where{
?s geo:lat ?lat ;geo:long ?long   ;
	FILTER(?long < -117.0)
FILTER(?lat >= 31.0)
  FILTER(?lat <= 33.0)
} ORDER BY ?s

% ./.build/release/sparql-parser lint examples/messy.rq 
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
SELECT ?s WHERE {
    ?s geo:lat ?lat ;
        geo:long ?long ;
    FILTER (?long < - 117.0)
    FILTER (?lat >= 31.0)
    FILTER (?lat <= 33.0)
}
ORDER BY ?s

要解析查询并打印生成的查询代数

% ./.build/release/sparql-parser parse examples/messy.rq
Query
  Select { ?s }
        Project { ?s }
          OrderBy { ?s }
            Filter (((?long < -117.0) && (?lat >= 31.0)) && (?lat <= 33.0))
              BGP
                ?s <http://www.w3.org/2003/01/geo/wgs84_pos#lat> ?lat .
                ?s <http://www.w3.org/2003/01/geo/wgs84_pos#long> ?long .

API

SPARQLSyntax 库提供了一个 API,用于解析 SPARQL 查询并访问生成的抽象数据结构。此 API 的主要组件是

术语 (Term)

struct Term 表示一个 RDF 术语 (IRI、空白节点或 RDF 字面量)。 Term 还提供对 XSD 数字类型的一些支持,在 Termenum NumericValue 之间架起桥梁,后者提供数字函数和 类型提升运算符

Triple, Quad, TriplePattern, 和 QuadPattern

struct Triplestruct QuadTerm 组合成 RDF 三元组和四元组。struct TriplePatternstruct QuadPattern 表示可以与具体的 TripleQuad 匹配的模式。模式不是由 Term 组成,而是由 enum Node 组成,enum Node 可以是绑定的 Term,也可以是命名的 variable

代数 (Algebra)

enum Algebra 是与 SPARQL 代数 对齐的查询模式的表示。情况包括简单的图模式匹配,例如 triplequadbgp,以及可用于连接其他 Algebra 值的更复杂运算符(例如 innerJoinunionprojectdistinct)。

Algebra 提供函数和属性来访问图模式的特征,包括:使用的变量;以及作用域内、可投影和“必须绑定”的变量。可以使用重写 API 修改 Algebra 值的结构,该 API 可以:将值绑定到特定变量;替换整个 Algebra 子树;并重写 Algebra 中使用的 Expression

表达式 (Expression)

enum Expression 表示变量、值、运算符和函数的逻辑表达式,可以在查询结果的上下文中对其进行评估以生成 Term 值。 Expression 用于以下 Algebra 操作:filter、left outer join ("OPTIONAL")、extend ("BIND") 和 aggregate。

可以使用类似于 Algebra 提供的重写 API 修改 Expression,该 API 可以:将值绑定到特定变量;并替换整个 Expression 子树。

查询 (Query)

struct Query 表示一个 SPARQL 查询,包括

SPARQLParser

struct SPARQLParser 提供了一个 API,用于解析 SPARQL 1.1 查询字符串并生成 Query

SPARQLSerializer

struct SPARQLSerializer 提供了一个 API,用于序列化 SPARQL 1.1 查询,可以选择应用“美化打印”规则以生成一致格式的输出。 它可以序列化结构化查询(QueryAlgebra)和非结构化查询(查询 String)。 在后一种情况下,即使查询包含语法错误,也可以使用序列化(错误后的数据按原样序列化)。

扩展

窗口函数

支持将窗口函数的解析作为 SPARQL 1.1 语法的扩展。 支持类似 SQL 的语法,用于在 SELECT 子句以及 HAVING 子句中投影窗口函数。 除了内置的聚合函数外,还支持以下窗口函数: RANK, ROW_NUMBER

下面显示了一些支持的语法的示例。

# "Limit By Resource"
# This query limits results to two name/school pairs per person
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?name ?school WHERE {
	?s a foaf:Person ;
		foaf:name ?name ;
		foaf:schoolHomepage ?school
}
HAVING (RANK() OVER (PARTITION BY ?s) < 2)
# Use window framing to compute a moving average over the trailing four results
PREFIX : <http://example.org/>
SELECT (AVG(?value) OVER (ORDER BY ?date ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) AS ?movingAverage) WHERE {
	VALUES (?date ?value) {
		(1 1.0)
		(2 2.0)
		(3 3.0)
		(4 2.0)
		(5 0.0)
		(6 0.0)
		(7 1.0)
	}
}