SPARQL 查询 DBLP
SPARQL query DBLP
我是运行这个查询
SELECT *
WHERE
{
?s dc:creator ?name .
?s rdf:type swrc:Article .
FILTER regex(str(?name), "Jeffrey", "D.", "Ullman") .
}
我收到以下错误:
Encountered " "," ", "" at line 16, column 41.
Was expecting one of:
<LANGTAG> ...
<INTEGER_POSITIVE> ...
<DECIMAL_POSITIVE> ...
这是怎么回事,我是不是不符合准则?我搜索了一下,在各种帖子中发现了相同的语法。
编辑:
当我要求
SELECT *
WHERE
{
?s rdf:type swrc:Article .
?s dc:creator ?name .
}
我回来了:
s name
<http://dblp.l3s.de/d2r/resource/publications/conf/www/BeszteriV07> [http] <http://dblp.l3s.de/d2r/resource/authors/Istvan_Beszteri> [http]
在一行中,第一个 URI 是 ?s
,第二个 URI 是 ?name
.
现在我知道有一个作者叫 "Jeffrey D. Ullman",我查询:
SELECT *
WHERE
{
?s rdf:type swrc:Article .
?s dc:creator ?name .
FILTER regex(str(?name), "Jeffrey")
}
LIMIT 10
。
然后我返回例如:
s name
<http://dblp.l3s.de/d2r/resource/publications/conf/www/LimWPVA07> [http] <http://dblp.l3s.de/d2r/resource/authors/Jeffrey_Scott_Vitter> [http]
所以这里的问题是我如何能够匹配 "Jeffrey D. Ullman" 并查看他写的所有文章。?
您的正则表达式函数语法不正确,请参阅 SPARQL1.1 spec。请注意 regex 恰好接受两个或三个参数,第一个是文本,第二个是模式,最后一个包含标志的可选字符串。
17.4.3.14 REGEX
xsd:boolean REGEX (string literal text, simple literal pattern)
xsd:boolean REGEX (string literal text, simple literal pattern, simple literal flags)
对 SPARQL 进行一些背景研究是个好主意。只是为了指出这里的确切问题,正则表达式将字符串与正则表达式进行匹配。所以如下:
FILTER regex(str(?name), "Jeffrey D\. Ullman") .
...将匹配 "Jeffrey D. Ullman"。以下:
FILTER regex(str(?name), "Ullman") .
...将匹配 "Jeffrey D. Ullman" 以及 ?name
中带有 "Ullman" 的任何内容。此过滤器:
FILTER regex(str(?name), "Ullman$") .
...将匹配任何以 "Ullman" 结尾的字符串。而这个过滤器:
FILTER regex(str(?name), "^Jeffrey.*Ullman$") .
...将匹配任何以 "Jeffrey" 开头,以 "Ullman" 结尾,中间有任何字符的字符串。
等等...
我是运行这个查询
SELECT *
WHERE
{
?s dc:creator ?name .
?s rdf:type swrc:Article .
FILTER regex(str(?name), "Jeffrey", "D.", "Ullman") .
}
我收到以下错误:
Encountered " "," ", "" at line 16, column 41.
Was expecting one of:
<LANGTAG> ...
<INTEGER_POSITIVE> ...
<DECIMAL_POSITIVE> ...
这是怎么回事,我是不是不符合准则?我搜索了一下,在各种帖子中发现了相同的语法。
编辑:
当我要求
SELECT *
WHERE
{
?s rdf:type swrc:Article .
?s dc:creator ?name .
}
我回来了:
s name
<http://dblp.l3s.de/d2r/resource/publications/conf/www/BeszteriV07> [http] <http://dblp.l3s.de/d2r/resource/authors/Istvan_Beszteri> [http]
在一行中,第一个 URI 是 ?s
,第二个 URI 是 ?name
.
现在我知道有一个作者叫 "Jeffrey D. Ullman",我查询:
SELECT *
WHERE
{
?s rdf:type swrc:Article .
?s dc:creator ?name .
FILTER regex(str(?name), "Jeffrey")
}
LIMIT 10
。
然后我返回例如:
s name
<http://dblp.l3s.de/d2r/resource/publications/conf/www/LimWPVA07> [http] <http://dblp.l3s.de/d2r/resource/authors/Jeffrey_Scott_Vitter> [http]
所以这里的问题是我如何能够匹配 "Jeffrey D. Ullman" 并查看他写的所有文章。?
您的正则表达式函数语法不正确,请参阅 SPARQL1.1 spec。请注意 regex 恰好接受两个或三个参数,第一个是文本,第二个是模式,最后一个包含标志的可选字符串。
17.4.3.14 REGEX
xsd:boolean REGEX (string literal text, simple literal pattern) xsd:boolean REGEX (string literal text, simple literal pattern, simple literal flags)
对 SPARQL 进行一些背景研究是个好主意。只是为了指出这里的确切问题,正则表达式将字符串与正则表达式进行匹配。所以如下:
FILTER regex(str(?name), "Jeffrey D\. Ullman") .
...将匹配 "Jeffrey D. Ullman"。以下:
FILTER regex(str(?name), "Ullman") .
...将匹配 "Jeffrey D. Ullman" 以及 ?name
中带有 "Ullman" 的任何内容。此过滤器:
FILTER regex(str(?name), "Ullman$") .
...将匹配任何以 "Ullman" 结尾的字符串。而这个过滤器:
FILTER regex(str(?name), "^Jeffrey.*Ullman$") .
...将匹配任何以 "Jeffrey" 开头,以 "Ullman" 结尾,中间有任何字符的字符串。
等等...