sem:sparql绑定属性路径

时间:2016-05-03 17:56:29

标签: sparql marklogic marklogic-8

我希望使用变量属性路径进行简单的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"), "+"))
  )
)

哪个也不起作用。谢谢你的任何建议。

2 个答案:

答案 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。

相关问题