我正在开发一个旅游指南网站。我想做的是阅读用户的Facebook签到并标记他们访问的位置(保存在我的数据库中,并从谷歌收集的坐标)。
我的问题是,我怎样才能最好地将保存在数据库中的位置与Facebook给出的位置进行比较。坐标不完全匹配,Facebook上的名称在许多情况下以多种变体保存。
我正在使用带有php的neo4j db。
这就是我想出的。希望它能帮助某人。
首先,我选择了一些坐标之差小于 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'].")
然后我使用 levenshtein() 函数校准"Levenshtein 距离"(您必须替换、插入或删除才能将 str1 转换为 str2 的最小字符数),并仅选择那些此值小于字符串长度/2 的字符。此值也可以根据您的需要进行调整。这是代码:
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的位置。