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)
问问题
439 次
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 回答