【发布时间】:2018-04-25 05:01:03
【问题描述】:
我正在尝试根据主题在有序列表中的相对位置返回主题。
一个主题可以与多个对象相关联(通过一个谓词),并且所有对象都在一个有序列表中。给定此列表中的参考对象,我想按照对象与参考对象的相对距离的顺序返回主题。
:a : :x
:b : :v
:b : :z
:c : :v
:c : :y
:ls :list (:v :w :x :y :z)
以x作为我们在列表中的起始对象,下面的代码返回
:a :x :0
:c :y :1
:b :v :2
:b :z :2
:c :v :2
我不希望返回所有位置,而是只希望返回与主体的最小对象“距离”相关的对象(这可能意味着每个主体最多两个对象 - 在列表的上方和下方)。所以我想回来
:a :x :0
:c :y :1
:b :v :2
:b :z :2
到目前为止的代码... (在Find lists containing ALL values in a set? 和Is it possible to get the position of an element in an RDF Collection in SPARQL? 的大力帮助下)
SELECT ?s ?p (abs(?refPos-?pos) as ?dif)
WHERE {
:ls :list/rdf:rest*/rdf:first ?o .
?s : ?o .
{
SELECT ?o (count(?mid) as ?pos) ?refPos
WHERE {
[] :list/rdf:rest* ?mid . ?mid rdf:rest* ?node .
?node rdf:first ?o .
{
SELECT ?o (count(?mid2) as ?refPos)
WHERE {
[] :list/rdf:rest* ?mid2 . ?mid2 rdf:rest* ?node2 .
?node2 rdf:first :x .
}
}
}
GROUP BY ?o
}
}
GROUP BY ?s ?o
ORDER BY ?dif
我一直试图通过按 ?s 分组来获得最小 ?dif(差异/距离),但是因为我必须将这个(类似于 ?dif = ?minDif)应用到之前的 ?s ?o 分组我不知道如何在这两个分组之间来回切换。
感谢您提供的任何帮助
【问题讨论】:
-
您确定这是 SPARQL 的正确用例吗?听起来像 Cypher 或 Gremlin 这样的图遍历引擎在这里会更好地工作。
-
感谢@AKSW 的这些建议。我想将列表提供的层次结构合并到我的 SPARQL 查询中,但如果我继续使用这种方法,我将研究图遍历引擎。
标签: sparql