Sparql 查找点的两个最近邻居

Sparql 查找点的两个最近邻居,sparql,Sparql,我想找到每个点的两个最近的邻居 数据集: :p1 :has_position 1 . :p2 :has_position 2 . :p3 :has_position 3 . :p4 :has_position 4 . 预期成果: ?POINT ?NEIGHBORS "p1" "p2; p3" "p2" "p1; p3" "p3" "p2; p4" "p4" "p2; p3" 我试着这样做: SELECT ?POINT ?POS (group_concat(?idPo

我想找到每个点的两个最近的邻居

数据集:

:p1 :has_position 1 .
:p2 :has_position 2 .
:p3 :has_position 3 .
:p4 :has_position 4 .
预期成果:

?POINT  ?NEIGHBORS
"p1"    "p2; p3"
"p2"    "p1; p3"
"p3"    "p2; p4"
"p4"    "p2; p3"
我试着这样做:

SELECT ?POINT ?POS (group_concat(?idPointN;separator='; ' )as ?NEIGHBORS)
WHERE{
    ?idPoint :has_position ?POS .
    ?idPointN :has_position ?POSN . FILTER (?idPoint != ?idPointN)
}
GROUP BY ?POINT ?POS
这将返回点的所有邻居。我想在
组中按(?POS-?POSN)下单
限制2
之类的事情,但我不知道怎么做

编辑:

我写这个查询

SELECT ?POINT ?NEIGHBOR
WHERE{
    ?idPoint rdfs:label ?POINT . FILTER(?idN != ?idPoint)
    ?idPoint :has_position ?POS .


    ?idN rdfs:label ?NEIGHBOR .
    ?idN :has_position ?POSN .
}
ORDER BY ?POINT abs(?POS-?POSN)
它给我的每一点,所有的邻居都按最近的顺序排列


我怎么能只有两个最接近的?同样地,在SPARQL中,每件事都获得前n名的查询非常棘手,而且目前还没有很好的方法。它几乎总是归结为一些奇怪的黑客。首先,带有前缀声明的数据:

@prefix : <urn:ex:>

:p1 :has_position 1 .
:p2 :has_position 2 .
:p3 :has_position 3 .
:p4 :has_position 4 .
现在,您还可以通过一个子查询来实现这一点,该子查询为每个p找到最小数量,然后在外部查询中,找到产生该数量的qr值:

前缀:
选择?p(concat(strafter(str(?q)、str(:)、“、”、strafter(str(?r)、str(:))作为?邻居){
{选择p(min(abs(?pos1-?pos2)+abs(?pos1-?pos3))作为d){
?p:有位置?位置1。
问:你的位置是什么?位置2。
r:有位置?位置3。
过滤器(?p!=?q&?p!=?r)
滤波器(str(?q)

为此,您可能需要一个带有orderby和limit的subselect。在SPARQL中,获取每个项目的前n值比较困难,但这种情况应该是可能的。我还尝试了以下方法:
SELECT?POINT?NEIGHBOR WHERE{idPoint rdfs:label?POINT.FILTER(?idNEIGHBOR!=?idPoint)?idPoint:has_position?POS.{SELECT?NEIGHBOR WHERE{?idNEIGHBOR rdfs:label?NEIGHBOR。?idNEIGHBOR:has_position?POSNEIGHBOR.}按点abs(?POS-?POSNEIGHBOR)LIMIT 2}排序
但结果是空的。我将在今天晚些时候对此进行尝试,但同时,看看它链接到的其他一些问题(参见注释)@JoshuaTaylor好的,谢谢,我会读你的帖子。子选择中的
LIMIT 2
效果很好,但我不能根据距离对值进行排序。
-------------------
| p   | neighbors |
===================
| :p1 | "p2, p3"  |
| :p2 | "p1, p3"  |
| :p3 | "p2, p4"  |
| :p4 | "p2, p3"  |
-------------------
-------------------
| p   | neighbors |
===================
| :p1 | "p2, p3"  |
| :p2 | "p1, p3"  |
| :p3 | "p2, p4"  |
| :p4 | "p2, p3"  |
-------------------