我希望使用变量属性路径进行简单的SPARQL查询。像
这样的东西sem:sparql("SELECT ?o WHERE { </person/10025613.xml> <hasManager>+ ?o . }")
该查询工作正常。但是现在当我想让语句使用变量时,我无法正确地进行语法检查。
sem:sparql("
SELECT ?o WHERE { ?s ?p+ ?o . }
", $params)
...导致意外的令牌语法。另外,我试过
let $params := map:new(
(
map:entry("s", sem:iri("/person/10025613.xml")),
map:entry("p", concat(sem:iri("hasManager"), "+"))
)
)
哪个也不起作用。谢谢你的任何建议。
答案 0 :(得分:4)
SPARQL属性路径显式不允许变量。见SPARQL 1.1 Property Paths。
您可以通过跟踪对象属性来跟踪包含变量的路径。例如:
SELECT ?o
WHERE {
?s ?p ?o1 .
?o1 ?p1 ?o .
}
答案 1 :(得分:0)
我认为在某些情况下,您可能希望为SPARQL属性路径分配多个值,而不用重写整个字符串。使用SPARQL实现是可能的,该实现允许在运行时定义名称空间。
例如:rdflib
是用于处理RDF图的python软件包,并包括用于执行SPARQL查询的插件。可以在运行时定义命名空间,这使我们可以使用以下技巧来定义变量属性路径(绑定变量的位置):
SELECT ?s ?o
WHERE {
?s p:+ ?o .
}
查询中未定义名称空间p:
。相反,我们可以在运行时指定所需的路径,例如与rdflib
:
from rdflib import Graph, URIRef
Graph().query(
query_string,
initNs={
"p": URIRef("https://www.example.com/your_predicate")
}
这不会帮助希望拥有变量路径的人,但可能会帮助希望在不破坏SPARQL语法规则的情况下在绑定变量上利用属性路径的表达的人。
我想这是危险的行为,应谨慎使用。任何可以提供可靠理由证明其违反SPARQL规则的人都将获得+1。