首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sparql防止循环查询(MarkLogic)

Sparql防止循环查询(MarkLogic)
EN

Stack Overflow用户
提问于 2019-07-25 18:03:27
回答 1查看 86关注 0票数 0

您好,我目前正在尝试在Marklogic中使用SPARQL做一些分析,想知道是否有可能防止循环查询?为了解释知道这一点的原因,我们将使用以下数据模型

假设我从A开始,最重要的是,我希望找到A和G之间的所有节点。在sparql中运行以下查询

代码语言:javascript
复制
node_A </link>* x
y </link>* node_G
x </link> y

我将无法获取它们之间的每一个节点,例如,我将缺少节点B。因为我认为MarkLogic Sparql不是最新的(1.1版),所以我不能使用"or“运算符来解决这个问题。因此,下一个解决方案是确保每个节点都指向或指向另一个节点,从而产生连接,例如

代码语言:javascript
复制
B=>F
F=>B

但是这样做会导致循环节点,因此,我很好奇是否可以防止SPARQL查询中的循环。或者,如果有任何其他方法可以检索节点X和节点Y之间的所有节点,请务必让我知道。

===Update===

使用的查询

代码语言:javascript
复制
xquery version "1.0-ml";

import module namespace sem = "http://marklogic.com/semantics" at "/MarkLogic/semantics.xqy";

let $query := sem:sparql(
'
PREFIX xs: <http://www.w3.org/2001/XMLSchema#>
PREFIX cts: <http://marklogic.com/cts#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema/>
PREFIX fn: <http://www.w3.org/2005/xpath-functions#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX db: <http://dbpedia.org/resource/>
PREFIX onto: <http://dbpedia.org/ontology/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns>
PREFIX xdmp: <http://marklogic.com/xdmp#>

SELECT DISTINCT ?x ?y
WHERE{
?x !</path> ?y .
}
',
(),
(),
()
)

return (
$query,
xdmp:elapsed-time(),
"Nil",
"Nil",
"Nil"
)

遇到错误

代码语言:javascript
复制
[1.0-ml] XDMP-UNEXPECTED: (err:XPST0003) Unexpected token syntax error, unexpected !
EN

回答 1

Stack Overflow用户

发布于 2019-08-16 21:27:49

我想你是在找|^吧。第一个是'or',后者允许以相反的方向跟随谓词。下面的代码似乎对我来说运行得很好。我运行的是ML 10,但我非常确定它在9和8中也能正常工作:

代码语言:javascript
复制
xquery version "1.0-ml";

xdmp:document-insert('/test/triples.json', object-node {
  "triple": array-node {
    sem:triple(sem:iri("node_A"), sem:iri("/link"), sem:iri("node_C")),
    sem:triple(sem:iri("node_D"), sem:iri("/link"), sem:iri("node_C")),
    sem:triple(sem:iri("node_C"), sem:iri("/link"), sem:iri("node_B")),
    sem:triple(sem:iri("node_C"), sem:iri("/link"), sem:iri("node_E")),
    sem:triple(sem:iri("node_F"), sem:iri("/link"), sem:iri("node_B")),
    sem:triple(sem:iri("node_F"), sem:iri("/link"), sem:iri("node_E")),
    sem:triple(sem:iri("node_F"), sem:iri("/link"), sem:iri("node_G")),
    sem:triple(sem:iri("node_E"), sem:iri("/link"), sem:iri("node_G"))
  }
})

;

sem:sparql("
SELECT DISTINCT ?x
WHERE {
  <node_A> (</link>|^</link>)* ?x.
  ?x (</link>|^</link>)* <node_G>.
  FILTER( !(?x = (<node_A>, <node_G>)) )
}
ORDER BY ?x
")

哈!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57199367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档