SPARQL查询引擎设计01
《基于启发式的SPARQL查询引擎的设计与实现》

《基于启发式的SPARQL查询引擎的设计与实现》一、引言随着大数据和知识图谱的广泛应用,语义Web技术的崛起带来了新的挑战和机遇。
其中,SPARQL(SPARQL Protocol and RDF Query Language)作为处理RDF(Resource Description Framework)数据的重要查询语言,被广泛用于语义Web数据访问。
为了应对海量数据的处理需求,设计并实现一个高效的SPARQL查询引擎变得尤为重要。
本文将详细阐述基于启发式的SPARQL查询引擎的设计与实现。
二、系统设计1. 设计目标本系统设计的目标是构建一个高效、可扩展的SPARQL查询引擎,以支持大规模RDF数据的快速查询。
此外,为了提高查询效率,系统将引入启发式算法优化查询过程。
2. 架构设计本系统采用分层架构设计,包括数据存储层、查询引擎层和应用层。
数据存储层负责存储RDF数据,采用分布式存储技术以提高数据存储和访问的效率。
查询引擎层是本系统的核心部分,负责解析SPARQL查询、优化查询过程并执行查询。
应用层则负责与用户进行交互,提供友好的查询接口。
三、启发式算法的引入为了进一步提高查询效率,本系统引入了启发式算法。
启发式算法通过分析查询请求的特点和RDF数据的结构,为查询过程提供优化建议。
具体而言,我们采用以下两种启发式算法:1. 查询优化启发式算法:根据查询请求的特点,自动调整查询策略,如调整子查询的顺序、选择合适的索引等,以提高查询效率。
2. 数据索引启发式算法:根据RDF数据的结构特点,自动选择合适的索引策略,如基于三元组的索引、基于属性的索引等,以提高数据访问速度。
四、查询引擎的实现1. 解析器模块解析器模块负责解析SPARQL查询请求。
它采用词法分析和语法分析技术,将SPARQL查询请求转换为抽象语法树(AST)。
AST为后续的查询优化和执行提供了方便。
2. 优化器模块优化器模块是本系统的核心模块之一。
理解 SPARQL - SPARQL中文详解

理解SPARQL使用语义Web 建立微型日志博客Andrew Matthews, 架构师和开发人员, 自由职业者简介:代表Web 未来的语义Web 是一个以知识为中心的模型,除了人类可读的文档和XML 消息格式之外,它还增加了机器可以理解和处理的数据。
SPARQL Protocol and RDF Query Language (SPARQL) 对于语义Web 就像SQL 对于关系数据库一样重要。
它允许应用程序对分布式RDF 数据库进行复杂的查询,并得到了互相竞争的多种框架的支持。
本教程通过一家虚拟公司的团队跟踪和日志系统演示了它的用法。
开始之前常用缩写词∙API:应用程序编程接口∙DOM:文档对象模型∙FTP:文件传输协议∙HTTP:超文本传输协议∙HTML:超文本标记语言∙OWL:Web 本体语言∙RDF:资源描述框架∙URI:统一资源标识符∙URL:统一资源定位符∙W3C:万维网联盟∙XML:可扩展标记语言本教程是为那些拥有很少或者没有语义Web 应用程序开发经验的开发人员编写的。
不需要任何编程或者开发工具,但是需要对Web 基础有所了解。
阅读完本教程后将能够使用Turtle 语言生成RDF 和OWL 本体(ontology)。
还会学到如何使用Jena 和Joseki 支持本体,以及使用SPARQL 进行查询。
关于本教程本教程介绍了SPARQL 以及基础数据格式。
还涵盖了RDF、RDF Schema、OWL 以及Turtle 知识表示语言。
通过这些语言可以建立本体或者域模型。
本教程的例子建立了用于日志和预约系统的本体和查询,可以生成带语义标签的类似twitter 的微型博客。
通过查询博客记录可以发现公司中具备您的项目所需技能并且可以组成团队的人员。
本教程的主要内容如下:∙介绍语义Web,包括RDF、OWL 和SPARQL∙如何使用Joseki 建立RDF Triple Store∙编写日志系统的SPARQL 查询回页首前提条件要学习本教程,需要下列工具:∙Java™ 环境—Java 运行时环境,用于运行SPARQL 的服务器Joseki。
SPARQL查询的特点

SPARQL查询的特点语义网开创了数据集成的新时代当然,已经有许多不同格式的现成数据。
将所有这些数据转换成RDF(语义网使用的格式)将是一个巨大的工程,所以最好以RDF的形式公开现有的数据介绍了语义网的核心概念和标准,阐述了如何将LDAP目录作为一种服务公开,语义网应用程序可以使用开源的SquirrelRDF工具。
采用了通用灵活的RDF(资源描述框架)标准,为数据共享和集成开辟了一个新时代。
RDF的特性使得跨不同数据源合并数据和查询变得很容易大量数据以其他形式存在,如XML、关系数据库和LDAP 目录。
RDF非常灵活,可以完全表达这些格式。
然而,将现有数据转换成RDF是一项巨大而昂贵的任务,并且在许多情况下是不必要的。
一些工具可以将现有数据公开为网络端点,这些端点可以通过语义网的查询语言SPARQL进行查询SquirrelRDF就是其中之一。
这个开源工具(参见参考资料中的链接)是耶拿语义网框架的一部分。
本文的目的是解释如何为可以通过SPARQL查询的LDAP目录创建端点,并介绍一个重要的语义网概念。
在创建了端点之后,我还将解释如何使用一些耶拿Java。
班级得到进一步提高。
最后,使用JavaScript从基于浏览器的客户端进行查询。
什么是语义网?语义网是一种新兴的技术,它基于一组表示数据、查询数据和对数据应用规则的标准核心技术包括用于表示的RDF、用于查询的SPARQL、用于构造的RDFS以及用于构造和推理的OWL。
语义网有许多突出的优点,包括更简单的数据集成、更准确的搜索、更方便的知识管理等。
因此,语义网这个词的含义越来越丰富(参见参考资料中关于语义网标准的更多信息)RDF是语义网的基础:一种将数据表示为有向加权图的标准资源是以全球唯一的、可解析的URI标记的实体图中的节点是资源和单词。
节点由有向边连接,边用谓词标记。
图表可以序列化,列出图表中的每条边。
每条边称为一条语句,有一个主语(边的源点)、一个谓语(边的标签)和一个宾语(边的汇点)因为每一个命题都有一个主语、谓语和宾语,所以也被称为三元组每个命题的主题必须是一种资源谓词也是资源。
基于SPARQL的图数据库的设计与实现

基于SPARQL的图数据库的设计与实现随着互联网的快速发展,越来越多的数据需要被存储和管理。
传统的关系型数据库已经不能满足运行效率的需求,而图数据库则成为了解决方案之一。
图数据库的特点是数据之间以图形结构相连,利用图形算法快速查询数据。
本文将介绍基于SPARQL的图数据库的设计与实现。
一、SPARQLSPARQL(SPARQL Protocol and RDF Query Language),是一种用于查询RDF数据的查询语言,是语义Web技术的一部分。
它可以用来查询和处理在RDF中表示的数据,并且可以关联多个RDF图。
其查询语言类似于SQL,但查询结果是一个包含三元组的集合,而不是表格。
SPARQL可以用于查询图数据库。
二、图数据库的设计图数据库以图形结构来表示对象之间的关系,因此需要对图结构进行设计。
在图数据库的设计中,需要考虑以下几个方面:1. 节点和边的属性在图数据库中,节点和边都可以有自己的属性。
节点属性可以表示节点的特征,比如名称、类型、标签等。
边属性可以表示两个节点之间的关系特征,比如权重、方向、距离等。
在设计图数据库时,需要先确定节点和边的属性,以方便后续的查询。
2. 节点和边的类型节点和边的类型可以帮助我们更好地理解数据模型。
在设计图数据库时,需要确定节点和边的类型,以便在查询时进行过滤和聚合操作。
3. 数据库索引为了提高图数据库查询的性能,需要建立合适的索引。
可以根据节点和边的属性来建立索引,以便在查询时快速定位数据。
三、图数据库的实现在实现图数据库时,我们可以使用现有的图数据库软件,比如Neo4j、OrientDB等。
这些软件已经实现了图数据库的核心功能,可以方便地进行节点和边的增删改查操作。
此外,我们还可以使用SPARQL语言来实现图数据库。
SPARQL可以用于查询和操作RDF数据,而RDF可以看作是一种基于图形结构的数据模型,因此我们可以将SPARQL和RDF进行结合,来实现图数据库。
SPARQL查询的关系代数表示与转换方法

a r rsna o fS A QL q e speetdT e sma t qiae c fti rl inlrpee t in i fr e i usd l e eett n o P R u r i rsne .h e ni e uvln eo s e t a ersna o s mt rds se. p i y c h ao t h c A q e rnfr n p rah i peetd t mpe n h u r r somain f m P Q ur o S u r l s ur t s mig apo c s rsne o i l y a o me tte q ey t fr t r n a o o SAR L q e t QL q e pa y y n
10 1 ຫໍສະໝຸດ 2 1 .72 ) 0 14 (2
C m ue E gn ei n A p i t n 计算机 工程 与应用 o p tr n ier ga d p l ai s n c o
S A QL查询 的关系代数表示与转换方法 PR
王进 鹏 , 张亚 非 , 苗 壮 ’
W ANG i p n Z Jn e g, HANG f i M I h a g Yae , AO Z u n
t a a e e e u e n r l t n l d tb s sRe u t s o h t c n b x c td o e ai a a a e . s l o a s h w ta i p r a h c n o v t e u r a s o a in p o lm f h t t s a p o c a s l e h q e t n f r t r b e e - h y r m o f ci ey et l. v Ke r s q e a so mai n;e ai n l ag b a r l t n l d tb s ; aa i tg ai n y wo d : u r tn f r to r lto a l e r ; ea i a a a a e d t n e r t y r o o
es qsl语法

es qsl语法Elasticsearch是一个开源的分布式搜索和分析引擎,它使用Query DSL来构建和执行各种类型的查询。
Elasticsearch的Query DSL采用JSON格式,可以通过发送JSON请求体来执行查询。
以下是一些常见的Query DSL语法元素:1. 查询类型(Query Types):Elasticsearch提供了多种类型的查询,如term查询、match查询、range查询等。
每种查询类型都有不同的语法和参数,用于满足不同的查询需求。
2. 查询子句(Query Clauses):查询语句由一个或多个查询子句组成。
每个查询子句指定了特定的查询条件和参数。
常见的查询子句包括bool、match、term、range等。
3. 查询字段(Query Fields):在查询中指定要搜索的字段。
可以是单个字段,也可以是多个字段。
例如,"field": "value"表示在指定字段中搜索特定值。
4. 过滤器(Filters):过滤器用于限制查询结果的范围。
它们可以基于特定条件对文档进行筛选,例如范围、存在性、正则表达式等。
5. 聚合(Aggregations):聚合用于根据指定的条件对查询结果进行分组和计算。
它可以生成统计数据、计算平均值、最大值、最小值等。
6. 排序(Sorting):排序用于指定查询结果的排序顺序。
可以按照一个或多个字段进行升序或降序排序。
7. 分页(Pagination):分页用于控制查询结果的返回数量和偏移量。
可以使用from和size参数来指定返回的文档数量和起始位置。
以上只是Query DSL的一些常见语法元素,实际使用中还有更多的功能和选项可供使用。
您可以参考Elasticsearch官方文档以获取更详细的信息和示例。
SPARQL查询实例解析

在SPARQL 之前,已经有不少研究人员致力于开发针对RDF 的查询语言,在这个网页/2001/11/13-RDF-Query-Rules/ 上有一个比较完整的列表。
SPARQL 是基于以前的RDF 查询语言(如rdfDB、RDQL 和SeRQL)发展而来的,拥有一些有价值的新特性,并且受到Jena 开发团队的鼎立支持。
Jena 是HP 公司语义网研究小组开发的一套Java 工具包,用来支持人们进行语义网的相关研究和应用开发。
SPARQL 的语法细节这里就不一一列举了,直接给出一个例子。
总体来说,SPARQL 的语法和传统SQL 的语法还是有几分相似的,大家应该不会陌生。
BASE </>PREFIX rdf: </1999/02/22-rdf-syntax-ns#>PREFIX foaf: </foaf/0.1/># 这是一个以BASE 为根的相对IRI PREFIX user: <users#>SELECT ?person ?name ?ageFROM <users.rdf>WHERE {person a foaf:Person ;foaf:name ?name .OPTIONAL { ?person user:age ?age } .FILTER (REGEX(?name, “clickstone”))}ORDER BY ASC(?name)LIMIT 10OFFSET 10简要的说明一下例子中出现的语法。
1. BASE,根IRI,其他以此为根的IRI 就可以写成相对形式了,见例子里面的注释。
一旦定义了BASE,就可以在SPARQL 的任何地方进行使用了,例子中共用到了 2 处。
2. 使用# 进行注释。
3. PREFIX,IRI 前缀的缩写。
4. SELECT,查询关键字,和SQL 中的一个意思。
5. ?person ?name ?age,要查询的变量,使用? 标识变量,也可以使用$。
SPARQL查询语句整理

SPARQL查询语句整理本⽂⼤多内容来⾃Joshua Taylor的回答查询⼦类或等价关系even though owl:equivalentClass is a symmetric property (i.e., from a owl:equivalentClass b we can infer b owl:equivalentClass a), the triple might be present in only one direction in the data在数据⾥⾯等价关系是单向表⽰的,因此查询等价类的语句为myClass (owl:equivalentClass|^owl:equivalentClass)* :MyClass查询等价属性的语句为p (owl:equivalentProperty|^ owl:equivalentProperty)* :order_no查询<http://class/加⼯过程> class的propertySELECT ?subclassWHERE {subclass rdfs:domain <http://class/加⼯过程>.#加⼯过程类的所有属性}查询<http://class/加⼯过程>的所有属性的所有数据(s p o)SELECT ?s ?subclass ?oWHERE {subclass rdfs:domain <http://class/加⼯过程>.#加⼯过程类的所有属性s subclass o#返回属性关联的所有数据}LIMIT 100查询所有实例及其对应类型SELECT ?instance ?s WHERE {instance rdf:type s. #找出实例的类型}查询值为1600KN20173的所有数据SELECT ?instance ?p WHERE {instance p “1600KN20173”. #找出属性值为V101208的所有实例}如何获取实例对应本体本体之间存在关系Human ----(hasPizza)---> Pizzas为本体添加实例Human:Jim ----(hasPizza)---> Pizzas:cheesePizza 执⾏语句:select ?x ?y where {x hasPizza y}返回?x=Jim和?y=cheesePizza如何得到实例对应本体?⽤turtle表⽰rdf@prefix : </pizzas#> .@prefix rdfs: </2000/01/rdf-schema#> .@prefix pizzas: </pizzas#> .@prefix owl: </2002/07/owl#> .@prefix xsd: </2001/XMLSchema#> .@prefix rdf: </1999/02/22-rdf-syntax-ns#> . pizzas:Jima pizzas:Human , owl:NamedIndividual ;pizzas:hasPizza pizzas:CheesePizza .pizzas:hasPizzaa owl:ObjectProperty ;rdfs:domain pizzas:Human ;rdfs:range pizzas:Pizza .pizzas:Humana owl:Class .pizzas:Pizzaa owl:Class .</pizzas>a owl:Ontology .pizzas:CheesePizzaa pizzas:Pizza , owl:NamedIndividual .可以看到在模型定义中,pizzas:hasPizzaa owl:ObjectProperty ;rdfs:domain pizzas:Human ;rdfs:range pizzas:Pizza .因此可以利⽤属性hasPizza的rdfs:domain和rdfs:range两个关系来获得查询语句为:prefix : </pizzas#>prefix rdfs: </2000/01/rdf-schema#>select ?domain ?range where {:hasPizza rdfs:domain ?domain ;rdfs:range ?range .}返回:-------------------| domain | range |===================| :Human | :Pizza |-------------------2.利⽤rdf:type获取SELECT DISTINCT ?s WHERE {instance rdf:type s. #找出所有三元组的类型}返回了本体和实例数据的类型,混在⼀起了,因为本体和数据都是⽤三元组表⽰的所以限定到具体数据,返回类型SELECT DISTINCT ?s WHERE {instance p "三⽉".instance rdf:type s. #找出实例的类型}实例的rdf:<rdf:RDFxmlns:rdf="/1999/02/22-rdf-syntax-ns#"xmlns:j.0="http://class/"xmlns:j.1="http://dataproperty/"xmlns:owl="/2002/07/owl#"xmlns:j.2="http://objectproperty/"xmlns:rdfs="/2000/01/rdf-schema#"xmlns:xsd="/2001/XMLSchema#"><j.0:维保 rdf:about="http://individual/维保/1600KN20173"><j.1:保养⼈>empty</j.1:保养⼈><j.1:实际保养⽇期>empty</j.1:实际保养⽇期><j.1:所需⼯时_⼈数_时间>2*0.1</j.1:所需⼯时_⼈数_时间><j.1:计划保养时间>3⽉5⽇——3⽉11⽇</j.1:计划保养时间><j.1:计划保养周>第10周</j.1:计划保养周><j.1:设备保养级别>1级</j.1:设备保养级别><j.1:⽉份>三⽉</j.1:⽉份><j.1:维保计划编号>1600KN20173</j.1:维保计划编号></j.0:维保>查询结果:上述查询语句是对整个数据库进⾏查询,所以查询了所有路径下的数据:"http://class/""http://dataproperty/""http://objectproperty/"等等⽐如下⾯语句就指定了在‘:’的范围中查找等价属性PREFIX : </semantic_web#>PREFIX owl: </2002/07/owl#>SELECT ?property WHERE {property (owl:equivalentProperty|^owl:equivalentProperty)* :order_id. }。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据库及信息管理本栏目责任编辑:闻翔军1前言传统的万维网在数据表达方式上存在着缺陷,早期使用的HTML语言的数据组织方式以及所表达的页面信息,主要面向用户直接阅读,不利于计算机处理。
到了九十年代中期,采用XML技术,促进了信息表达和交换过程中语法描述的统一,但是XML描述的数据却缺乏统一的语义,无法满足机器在语义层次上对信息进行处理的要求。
因此,W3C推荐以RDF(ResourceDescriptionFramework)标准来解决XML的语义局限。
RDF成为SemanticWeb表达资源语义信息的基础,随着SemanticWeb研究的发展,RDF得到了广泛的应用。
RDF数据查询和数据访问标准的制定工作,滞后于RDF数据定义和存储标准。
在RDF存储模式出现后的相当长的时间内,查询RDF数据还没有任何标准,所以在商业项目和开源项目上,很多开发者设计出多种用于访问RDF数据的查询语言,在文献[2]记载着不少于20种的RDF查询语言,但是这些语言缺乏共同的语法和语义标准。
SPARQL是W3C的RDF数据访问工作组(DAWG)开发的RDF查询语言,目前被指定为候选推荐标准,因此SPARQL得到了广泛的支持。
但是SPARQL仅仅可以描述查询,而不能实现查询。
为实现SPARQL描述的查询,必须要有能够解释SPARQL查询语句,并执行查询操作的引擎的支持。
本文主要讨论一个通用的不依赖于具体RDF平台的SPAR-QL查询引擎的设计与实现,为此,论文从SPARQL语法解析器、引擎系统的优化设计等方面进行了深入的探讨,提出了合理的设计策略和实现方法。
2SPARQL查询语言概述[1]SPARQL(SimpleProtocolandRDFQueryLanguage)是一种面向RDF数据模型的查询语言和数据访问协议,用于访问任何可以映射到RDF模型的数据资源(本地的或远程的)。
SPARQL由三个独立的规范构成:查询语言规范(theQueryLanguageSpecification);SPARQL数据访问协议(SPARQLdataaccessProtocol);查询结果的XML格式(XMLformatofqueryresults)。
为讨论SPARQL查询引擎的设计,下面简单介绍SPARQL查询语言规范。
2.1SPARQL查询的组成部分一个SPARQL查询由四个部分组成:数据集DS:是RDF图的集合,即提供信息的RDF数据源;图模式GP:是待匹配子图模板,用于表达查询意图;解修饰符SM:指定查询结果集的约束条件;结果格式R:指定查询结果的输出形式。
下面的例了清晰地展示了SPARQL查询的四个组成部分。
例1:SPARQL查询语句示例2.2RDF数据集(RDFDataset)在SPARQL查询中,用RDF数据集指定查询的数据源。
RDF数据集由一个不需具名的“缺省图”和零到多个“具名图”组成。
使用FORM子句指定缺省图,使用FORMNAME子句指定具名图,每个具名图用一个IRI标识,而这些IRI在一个查询内是互不相同的。
2.3图模式(GraphPattern)SPARQL图模式用于表达查询意图,SPARQL设置了七种图模式:三元组模式、基本图模式、组图模式、可选图模式、并图模式、RDF数据集图模式和值约束。
图模式的表达能力实际上决定了SPARQL的查询能力,这七种图模式可以组合成为更大更为复杂的图模式,这也意味着SPARQL有强大的数据查询能力。
2.4解序列修饰(SolutionSequenceModifier)查询模式产生一个无序的解集,SPARQL提供解序列修饰SM(SolutionSequenceModifier)用于进一步提炼查询结果创建新的解集。
SPARQL有以下五种解序列修饰。
排序(Order)、非重复(Distinct)、结果上限(Limit)、结果偏移(Offset)、投影(Projection)2.5查询结果形式(QueryResultForm)SPARQL提供了四种类型的查询结果形式:1)Select形式:SELECT形式返回与查询变量绑定的值。
2)Construct形式:根据查询结果创建并返回结果RDF图,这个结果图是以图模板(GraphTemplate)为式样创建的。
3)DESCRIBE形式:返回一个RDF图,其中包含了关于资源的RDF描述。
4)Ask形式:ASK用于测试一个图模式是否有解,其返回值是一个布尔值。
3SPARQL语法解析器设计任何一门计算机语言都有严谨的形式化的语法定义,SPAR-收稿日期:2007-04-29作者简介:陈彦(1969-),男,湖南祁阳人,中南大学信息科学与工程学院硕士在读,讲师,研究方向:智能信息处理。
SPARQL查询引擎设计陈彦(湖南永州职业技术学院,湖南永州425006)摘要:论文以通用的不依赖于具体RDF平台的SPARQL查询引擎的设计与实现作为研究对象。
并从SPARQL语法解析器、引擎系统的优化设计等方面进行了深入的探讨,提出了合理的设计策略和实现方法。
关键词:SPARQL;RDF;SPARQLEngine;JavaCC中图分类号:TP311.52文献标识码:A文章编号:1009-3044(2007)10-20947-03DesignoftheSPARQLQueryEngineCHENYan(YongzhouVocationalandTechnicalCollegeHunanProvince,Yongzhou425006,China)Abstract:ThepapertakesthedesignsandtheimplementationoftheSPARQLqueryenginewhichdoesnotrelyontheconcreteplatformofRDFastheobjectsofstudy.ThepaperalsohascarriedonthethoroughdiscussiononthegrammarparserofSPARQL,theoptimizeddesignsoftheenginesystemandsoon,andhasproposedthereasonabledesignstrategiesandmethodstoimplementthem.Keywords:SPARQL;RDF;SPARQLEngine;JavaCC947电脑知识与技术数据库及信息管理本栏目责任编辑:闻翔军QL语言也不例外,文献[1]中记录了SPARQL语言的形式化语法描述,它采用了LL(1)文法形式。
SPARQL语法解析即是对客户查询表达式进行词法分析和语法分析,从而判断该表达式是否符合SPARQL的语法规则。
语法解析的依据是SPARQL的形式化语法定义。
3.1JavaCC解析器生成工具关于词法和语法分析器的设计在编译原理中有非常成熟完善的理论,可以手工进行词法和语法分析器的设计。
但这将是一项非常繁重的工作,而且硬编码解析器也缺乏灵活性。
一种更简单的做法是利用现有的编译器生成工具(Compiler-compiler)自动生成解析器代码。
JavaCC(Javacompiler-compiler)是用一种可以生成Java代码的“编译器的编译器”,或者称之为“解析器生成器”,JJTree是JavaCC预处理工具。
关于JJTree和JavaCC的用法可以参阅[3][4],使用JJTree和JavaCC开发解析器的流程如下:1)根据SPARQL语言的形式化语法描述,编写符合JJTree语法要求的.jjt脚本文件;2)用JJTree编译该.jjt脚本得到中间.jj文件;3)用JavaCC编译这个中间.jj文件,得到解析器。
3.2生成SPARQL语法解析器编写JJTree脚本文件要求开发者对SPARQL语言有深刻的认识,并对解析器将来的工作有一个全面的把握。
这个工作十分细致而繁琐,也是一个不断调试与修改的过程。
为了减少语法树的深度,我们在编写JJT脚本时,尽量取消无用的节点。
JJTree和JavaCC编译工具根据每个非终端节点的产生式规则自动成生成节点类。
这些节点类在解析器解析一个查询表达式时,被实例化为节点对象,构成一棵解析树。
图1是解析树示例。
例2一个简单的Select查询表达式:Select?sfrom<http://...>where?s?p?o图1所示是例2的解析树。
图1一个简单的SPARQL解析树要最终实现查询功能,还必须向这些结点类中添加解析代码。
查询的处理过程会涉及到整棵解析树的各个节点,JJTree在解析树的节点中自动添加了遍历子节点的机制。
4SPARQL查询引擎优化设计4.1引擎功能分析SPARQL查询引擎定位于应用程序和RDF服务器之间,为RDF服务平台提供SPARQL查询解析,如图2所示。
查询引擎功能需求描述如下:查询引擎不是面向终端用户的RDF应用程序,不提供可视化的用户界面;查询引擎也不是RDF服务系统,因而它的目标不是为终端用户提供RDF数据存储和访问的完整解决方案;查询引擎位于RDF应用和RDF服务平台之间,为RDF服务器添加SPARQL查询解释执行功能。
独立性:不同的RDF平台有不同的存储访问方式,该引擎不依赖于任何实际的RDF服务平台,具有跨越不同RDF服务平台的通用性。
部署能力强:引擎可以部署到一个具体的RDF服务平台中,而不需要重建。
高效性:一个没有效率的系统,是没有实行价值的。
由于受制于独立性要求,高效性的处理不能针对具体的平台进行优化,只能优化自身的处理逻辑。
4.2实现策略(1)独立性和可部署性独立性意味着该系统应该有一个不依赖于底层RDF服务平台的设计方案。
为此,我们设计查询引擎使用一个通用接口(RdfResource)访问底层RDF服务器。
RdfResource的接口只提供简单的基于通配符匹配的三元组访问方法,如getStatment(Valuesubj,URIpred,Valueobj),即通过subj,pred,obj三个参数指定想查找的三元组的主体、谓词和客体,若省略其中任何一个参数,意味着该参数是一个通配符。
但是底层RDF服务器提供的数据访问接口与RdfResource接口不一定匹配,这就需要设计一个适配器(adapter),让适配器完成RdfResource接口与RDF平台接口的匹配,适配器的实现与具体的RDF服务器相关。
(2)高效性引擎的独立性与可部署性意味着它不是为某个RDF服务器的具体实现而量身定做的,这往往容易导致系统的低效性,因此可部署性和独立性实际上制约了效率的目标。
既然不能为专门的RDF服务器进行代码优化,那就尽可能地优化查询引擎中与SPARQL规范相关的通用逻辑,以尽量提高查询处理的效率。