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找到最小数量,然后在外部查询中,找到产生该数量的q和r值:
前缀:
选择?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" |
-------------------