Так вот что я придумал. Надеюсь, это поможет кому-то.
Сначала я выбрал некоторые пункты назначения, где разница между координатами меньше 0,25. Вы можете отрегулировать это значение по мере необходимости. Мой высчитывать запрос выглядит следующим образом:
START n = node:Destination('*:*')
WHERE has(n.lat) AND has(n.long) AND ABS(n.lat - ".$value['place']['location']['latitude'].") < 0.25 AND ABS(n.long - ".$value['place']['location']['longitude'].") < 0.25
RETURN n, ABS(n.lat - ".$value['place']['location']['latitude']."), ABS(n.long - ".$value['place']['location']['longitude'].")
Тогда я Расчитайте «Левенштейн» (минимальное количество символов, которые вы должны заменить, вставить или удалить, чтобы трансформировать str1 в str2.) С levenshtein() функции и выбрать только те, те которые имеют это значение меньше длины строки/2. Это значение также может быть скорректировано для ваших нужд. И Heres код:
foreach($nodes as $key2 => $value2){
$name1 = strtolower($value2['x']->getProperty('name'));
$name2 = strtolower($value['place']['name']);
$name2 = explode(",", $name2);
$name2 = $name2[0];
$similarity = levenshtein($name1, $name2);
if(abs($similarity) <= intval(strlen($name1)/2)){
array_push($similarityArray,$value2);
}
}
После этого я сузил его, выбирая места, которые были ближайшими просто так:
$minDifference = 0.4;
foreach($similarityArray as $key2 => $value2){
if($minDifference > ($value2[1]+$value2[2])){
$minDifference = ($value2[1]+$value2[2]);
$minKey = $key2;
}
}
Места, скорее всего, будет один с ключом $ minKey ,
Вы ознакомились с пространственной библиотекой Neo4j? На сайте Neo4j, посвященном Neo4j Spatial, есть [веб-страница] (http://www.neo4j.org/develop/spatial). Оттуда вы можете посмотреть сообщение [Поиск вещей, близких к другим вещам] (http://blog.neo4j.org/2011/03/neo4j-spatial-part1-finding-things.html). Я понимаю, что пространственная библиотека не основана на php, но вы все еще можете работать с ней или, по крайней мере, учиться на ней ... –