% swift build -c release
要将 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 .
SPARQLSyntax
库提供了一个 API,用于解析 SPARQL 查询并访问生成的抽象数据结构。此 API 的主要组件是
struct Term
- RDF 术语(IRI、字面量或空白节点)的表示enum Algebra
- 与正式 SPARQL 代数密切相关的查询模式的表示enum Expression
- 逻辑表达式的表示struct Query
- SPARQL 查询的表示,包括:查询形式 (SELECT
, ASK
, DESCRIBE
, 或 CONSTRUCT
), 查询 Algebra
, 以及可选的基本 URI 和数据集规范struct SPARQLParser
- 解析 SPARQL 查询字符串/数据并返回 Query
struct SPARQLSerializer
- 提供序列化查询的能力,可以选择应用“美化打印”格式struct Term
表示一个 RDF 术语 (IRI、空白节点或 RDF 字面量)。 Term
还提供对 XSD 数字类型的一些支持,在 Term
和 enum NumericValue
之间架起桥梁,后者提供数字函数和 类型提升运算符。
struct Triple
和 struct Quad
将 Term
组合成 RDF 三元组和四元组。struct TriplePattern
和 struct QuadPattern
表示可以与具体的 Triple
和 Quad
匹配的模式。模式不是由 Term
组成,而是由 enum Node
组成,enum Node
可以是绑定的 Term
,也可以是命名的 variable
。
enum Algebra
是与 SPARQL 代数 对齐的查询模式的表示。情况包括简单的图模式匹配,例如 triple
、quad
和 bgp
,以及可用于连接其他 Algebra
值的更复杂运算符(例如 innerJoin
、union
、project
、distinct
)。
Algebra
提供函数和属性来访问图模式的特征,包括:使用的变量;以及作用域内、可投影和“必须绑定”的变量。可以使用重写 API 修改 Algebra
值的结构,该 API 可以:将值绑定到特定变量;替换整个 Algebra
子树;并重写 Algebra
中使用的 Expression
。
enum Expression
表示变量、值、运算符和函数的逻辑表达式,可以在查询结果的上下文中对其进行评估以生成 Term
值。 Expression
用于以下 Algebra
操作:filter、left outer join ("OPTIONAL")、extend ("BIND") 和 aggregate。
可以使用类似于 Algebra
提供的重写 API 修改 Expression
,该 API 可以:将值绑定到特定变量;并替换整个 Expression
子树。
struct Query
表示一个 SPARQL 查询,包括
SELECT
, ASK
, DESCRIBE
, 或 CONSTRUCT
, 以及任何相关数据,例如投影变量,或用于 CONSTRUCT
结果图的三元组模式)Algebra
)struct SPARQLParser
提供了一个 API,用于解析 SPARQL 1.1 查询字符串并生成 Query
。
struct SPARQLSerializer
提供了一个 API,用于序列化 SPARQL 1.1 查询,可以选择应用“美化打印”规则以生成一致格式的输出。 它可以序列化结构化查询(Query
和 Algebra
)和非结构化查询(查询 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)
}
}