官网翻译版:https://blog.csdn.net/minosisterry/article/details/102613785
基本模式
把查询语句理解成模式匹配,匹配模式即’实例-关系-实例‘的三元组模式匹配,这里的查询都是对实例的
最简单的查询
下面这个?x和“John Smith”都是实例,中间<>内容是关系,意思是查询x,其中x 的 FN(全名) 为 “John Smith”
SELECT ?x
WHERE { ?x <http://www.w3.org/2001/vcard-rdf/3.0#FN> "John Smith" }
注:?代表后面紧跟的是变量或者说未知量,即要查询的量
第二个查询,与第一个的区别就是,第一个查询结果只显示一列x,第二个显示两列x和fname。理解为查询存在FN关系的三元组
SELECT ?x ?fname
WHERE {?x <http://www.w3.org/2001/vcard-rdf/3.0#FN> ?fname}
基本模式的组合
如下,语句间用英文句号隔开,每句话仍是三元组模式。下面查询的是姓(Family)为“Smith”的人的名(Given)
SELECT ?givenName
WHERE
{ ?y <http://www.w3.org/2001/vcard-rdf/3.0#Family> "Smith" .
?y <http://www.w3.org/2001/vcard-rdf/3.0#Given> ?givenName .
}
代码简化-前缀编写URI
如下,使用vcard代替其后一长串URI,<>中是关系的URI,可以理解为标识符或者地址
PREFIX vcard: <http://www.w3.org/2001/vcard-rdf/3.0#>
SELECT ?givenName
WHERE
{ ?y vcard:Family "Smith" .
?y vcard:Given ?givenName .
}
过滤器
1.查找名称中带有“ r”或“ R”的名称 ----regex内的为正则表达式
PREFIX vcard: <http://www.w3.org/2001/vcard-rdf/3.0#>
SELECT ?g
WHERE
{ ?y vcard:Given ?g .
FILTER regex(?g, "r", "i") }
2.查找24岁以上的人的名字是: ----算术表达式必须在圆括号中
PREFIX info: <http://somewhere/peopleInfo#>
SELECT ?resource
WHERE
{
?resource info:age ?age .
FILTER (?age >= 24)
}
可选信息-optional
获取一个人的名字以及他们的年龄(如果有该信息的话)
PREFIX info: <http://somewhere/peopleInfo#>
PREFIX vcard: <http://www.w3.org/2001/vcard-rdf/3.0#>
SELECT ?name ?age
WHERE
{
?person vcard:FN ?name .
OPTIONAL { ?person info:age ?age }
}
结果,有年龄存在的会显示年龄
------------------------
| name | age |
=======================
| "Becky Smith" | 23 |
| "Sarah Jones" | |
| "John Smith" | 25 |
| "Matt Jones" | |
-----------------------
取并集-union
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX vCard: <http://www.w3.org/2001/vcard-rdf/3.0#>
SELECT ?name1 ?name2
WHERE
{
{ [] foaf:name ?name1 } UNION { [] vCard:FN ?name2 }
}
---------------------------------
| name1 | name2 |
=================================
| "Matt Jones" | |
| "Sarah Jones" | |
| | "Becky Smith" |
| | "John Smith" |
---------------------------------
执行语句
data为rdf或owl文件,query是查询语句所在的文件
sparql --data=vc-db-1.rdf --query=q1.rq
sparql查询protege生成的owl文件
prefix 项目名: <http://www.semanticweb.org/minosisterry/ontologies/2019/9/项目名#>
#项目名为owl文件的项目名,<>中为owl文件前几行的‘xlmns:项目名=“...项目名#”’中双引号中的内容
select ?x
where
{
项目名:实例名 项目名:关系名 ?x.
#注释,未知实例可以在前也可以在后,根据关系的domin和range决定
}