ich die beiden nächsten Nachbarn von jedem PunktFinden Sie die zwei nächsten Nachbarn von Punkten
-Datensatz finden wollen:
:p1 :has_position 1 .
:p2 :has_position 2 .
:p3 :has_position 3 .
:p4 :has_position 4 .
erwarteten Ergebnisse:
?POINT ?NEIGHBORS
"p1" "p2; p3"
"p2" "p1; p3"
"p3" "p2; p4"
"p4" "p2; p3"
ich versuche, etwas wie folgt aus:
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
Dies gibt alle Nachbarn von Punkten zurück. Ich möchte etwas wie ORDER BY(?POS-?POSN)
und limit 2
in der group_concat
tun, aber ich weiß nicht wie.
EDIT:
Ich schreibe diese Abfrage
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)
Es mir geben für jeden Punkt alle Nachbarn, um von der nächsten.
Wie kann ich nur die 2 am nächsten haben? und auf der gleichen Linie?
Dafür benötigen Sie wahrscheinlich einen Subselect mit einer Bestellung bis zu einem Limit. Es ist in SPARQL schwieriger, die Top-N-Elemente zu erhalten, aber dieser Fall sollte möglich sein. –
Ich habe auch versucht, diese \t SELECT POINT NACHBAR \t WHERE { \t \t idPoint rdfs:??? Label POINT. FILTER (? IdNEIGHBOR! =? IdPoint) \t \t? IdPoint: hat_position? POS. \t \t { \t \t \t SELECT NACHBAR \t \t \t WHERE { \t \t \t \t idNEIGHBOR rdfs:?? Label NACHBAR. \t \t \t \t? IdNEIGHBOR: hat_position? POSNEIGHBOR. \t \t \t} \t \t \t ORDER BY? POINT abs (? POS-? POSNEIGHBOR) \t \t \t LIMIT 2 \t \t} \t \t} ' Aber Ergebnis ist –
leer Ich werde Schießen Sie etwas später am Tag, aber in der Zwischenzeit, werfen Sie einen Blick auf http://stackoverflow.com/questions/27061096/sparql-using-subquery-with-limit und einige der anderen Fragen, auf die es verweist (siehe Kommentare). –