1
sparql> PREFIX ab: <http://learningsparql.com/ns/addressbook#>
Executing update...
Update executed in 160 ms
sparql> SELECT ?craigEmail WHERE { ?person ab:firstName "Craig" }
Malformed query: org.eclipse.rdf4j.query.parser.sparql.ast.VisitorException: 
QName 'ab:firstName' uses an undefined prefix

sparql> SELECT ?craigEmail WHERE { ?person 
<http://learningsparql.com/ns/addressbook/firstName> "Craig" }
Evaluating SPARQL query...
+-----------------------------------------------------------------------------+
| craigEmail                                                                  |
+-----------------------------------------------------------------------------+
+-----------------------------------------------------------------------------+
0 result(s) (64 ms)
4

2 回答 2

1

默认情况下,RDF4J 控制台只接受单行 SPARQL 查询,所以就像 James 在他的回答中建议的那样:将查询作为单行输入。

或者,您可以使用sparql命令进入多行模式:

memory> sparql
enter multi-line SPARQL query (terminate with line containing single '.')
PREFIX ab: <http://learningsparql.com/ns/addressbook#>
SELECT ?craigEmail WHERE { ?person ab:firstName "Craig" }
.
Evaluating SPARQL query...
+-----------------------------------------------------------------------------+
| craigEmail                                                                  |
+-----------------------------------------------------------------------------+
+-----------------------------------------------------------------------------+
0 result(s) (93 ms)
memory>

当您复制粘贴较大的查询时,这特别有用。

顺便说一句,您执行的第一个“查询”:

sparql> PREFIX ab: <http://learningsparql.com/ns/addressbook#>
Executing update...
Update executed in 160 ms

输出具有误导性,因为“执行更新”表明您刚刚添加了新的命名空间前缀。但事实并非如此。相反,控制台将此解释为缺少“主体”的 SPARQL 更新,并将其作为空更新执行。前缀被忽略。可以说这是 SPARQL 解析器中的一个错误,因为严格来说,没有正文的前缀声明不是合法查询。

没有通过控制台向 RDF4J 存储添加新命名空间前缀的“官方”方法,但是您可以使用一个技巧(尽管这仅在您在您的存储或 SPARQL 端点上执行时才有效有写权限):

PREFIX ab: <http://learningsparql.com/ns/addressbook#> INSERT DATA {}

这将执行 SPARQL 更新以插入新的三元组,但使用一个空块(因此没有插入实际的三元组)。但是,这会将命名空间前缀添加到存储库,之后您不再需要为输入到控制台的每个查询声明它:

memory> show n
--no namespaces found--
memory> PREFIX ab: <http://learningsparql.com/ns/addressbook#> INSERT DATA {}
Executing update...
Update executed in 3 ms
memory> show n
+----------
|ab  http://learningsparql.com/ns/addressbook#
|rdf  http://www.w3.org/1999/02/22-rdf-syntax-ns#
|owl  http://www.w3.org/2002/07/owl#
|xsd  http://www.w3.org/2001/XMLSchema#
|fn  http://www.w3.org/2005/xpath-functions#
|rdfs  http://www.w3.org/2000/01/rdf-schema#
|sesame  http://www.openrdf.org/schema/sesame#
+----------
memory> SELECT ?craigEmail WHERE { ?person ab:firstName "Craig" }
Evaluating SPARQL query...
+-----------------------------------------------------------------------------+
| craigEmail                                                                  |
+-----------------------------------------------------------------------------+
+-----------------------------------------------------------------------------+
0 result(s) (47 ms)
memory>
于 2017-12-05T22:22:30.290 回答
1

尝试将前缀与查询放在同一行(这样所有内容都在一行上)。

于 2017-12-05T21:01:35.837 回答