Neo4j 查找用户附近的人';她最后的位置

Neo4j 查找用户附近的人';她最后的位置,neo4j,Neo4j,我试图找到人,他们在过去24小时内靠近用户的最后一个位置,以便使用一个简单的推荐引擎。出于测试目的,我的数据集很简单: 我的问题出了什么问题?它多次返回用户Ayse,但我不希望同一个人返回两次或更多 以下是我的疑问: var neo4j = require('neo4j-driver').v1; var driver = neo4j.driver("bolt://localhost", neo4j.auth.basic("neo4j", "neo4j")); var session = dri

我试图找到,他们在过去24小时内靠近用户的最后一个位置,以便使用一个简单的推荐引擎。出于测试目的,我的数据集很简单:

我的问题出了什么问题?它多次返回用户Ayse,但我不希望同一个人返回两次或更多

以下是我的疑问:

var neo4j = require('neo4j-driver').v1;
var driver = neo4j.driver("bolt://localhost", neo4j.auth.basic("neo4j", "neo4j"));
var session = driver.session();

function runQuery(query) {

    session.run(query, {}).then(function(result){

        console.log("finish")

        result.records.forEach(function(record) {
            console.log(record._fields)
        })

    }).catch(console.log);
}

//runQuery("MATCH (n) DETACH DELETE n" )


function newUser(user) {
    runQuery("CREATE (:User{name:'"+user+"'})")
}

function newLocation(user, lat, lon) {
    var q = 
"MATCH (u:User{name:'"+user+"'}) "+
"CREATE (l:Location{lat: "+lat+", lon: "+lon+", created_at: TIMESTAMP()}) "+
"CREATE (u)-[:HAVE_BEEN]->(l) "
    runQuery(q)
}

/*
newUser("Ozgur")
newUser("Fatma")
newUser("Ayse")
*/

/*
newLocation("Ozgur", 38.134972, 26.96681)
newLocation("Ozgur", 37.239972, 25.96681)
newLocation("Ozgur", 38.334972, 16.96681)
*/

/*
newLocation("Ayse", 38.294972, 26.76681)
newLocation("Ayse", 37.639972, 25.66681)
newLocation("Ayse", 35.134972, 18.96681)
*/

/*
newLocation("Fatma", 31.114972, 21.76681)
newLocation("Fatma", 31.139972, 21.66681)
*/

function findUserRecommendation(user) {
    // get user recommendations
    var q = 
"MATCH "+

//get user locations for last 24 hours (me_loc)
"(me:User{name:'"+user+"'})-[:HAVE_BEEN]->(me_loc:Location), " +

// strangers (recommendations)
"(l:Location)<-[:HAVE_BEEN]-(stranger:User) " +

"WHERE "+
    //except me
    "NOT me = stranger "+

    // nearest location algorithm based on KM 
    "AND 2 * 6371 * "+
    "asin("+
        "sqrt("+
            "haversin(radians(me_loc.lat - l.lat)) + "+
            "cos(radians(me_loc.lat)) * "+
            "cos(radians(l.lat)) * haversin(radians(me_loc.lon - l.lon))"+
        ")"+
    // 500 km
    ") < 500 " +

    // last 24 hours of they location
    //"AND l.created_at > (TIMESTAMP() - 604800) "+

    // last 24 hours of user's location
    //"AND me_loc.created_at > (TIMESTAMP() - 604800)" + 

// return every stranger's name and last location once
// but returning Ayse's name and different location more than once
"RETURN DISTINCT  stranger.name, l.lat, l.lon"
    runQuery(q)
}

findUserRecommendation("Ozgur")
var neo4j=require('neo4j-driver')。v1;
var驱动器=neo4j.驱动器(“bolt://localhost,neo4j.auth.basic(“neo4j”,“neo4j”);
var session=driver.session();
函数runQuery(query){
run(查询,{}).then(函数(结果){
控制台日志(“完成”)
result.records.forEach(函数(记录){
console.log(记录字段)
})
}).catch(console.log);
}
//运行查询(“匹配(n)分离删除n”)
函数newUser(用户){
runQuery(“创建(:User{name:'“+User+'})”
}
函数newLocation(用户、lat、lon){
变量q=
“匹配(u:User{name:'”+User+“})”+
创建(l:Location{lat:+lat+”,lon:+lon+,在:TIMESTAMP()处创建)+
“创建(u)-[:已被]->(l)”
运行查询(q)
}
/*
新用户(“Ozgur”)
新用户(“Fatma”)
新用户(“Ayse”)
*/
/*
新地点(“奥兹古尔”,38.134972,26.96681)
新址(“奥兹古尔”,37.239972,25.96681)
新址(“奥兹古尔”,38.334972,16.96681)
*/
/*
新址(“Ayse”,38.294972,26.76681)
新址(“Ayse”,37.639972,25.66681)
新址(“Ayse”,35.134972,18.96681)
*/
/*
新址(“Fatma”,31.114972,21.76681)
新址(“Fatma”,31.139972,21.66681)
*/
函数findUserRecommendation(用户){
//获取用户推荐
变量q=
“匹配”+
//获取过去24小时的用户位置(me_loc)
“(me:User{name:'“+User+”})-[:HAVE_BEEN]->(me_loc:Location),”+
//陌生人(推荐)
(l:位置)(时间戳()-604800)+
//用户位置的最后24小时
//“和me_loc.created_at>(TIMESTAMP()-604800)”+
//返回每个陌生人的姓名和最后位置一次
//但是不止一次地返回Ayse的名字和不同的位置
返回不同的陌生人名称、l.lat、l.lon
运行查询(q)
}
findUserRecommendation(“Ozgur”)

DISTINCT
聚合外部只确保不会得到重复的结果行,它不会将每个
DISTINCT
元素限制在第一行(它实际上作为一个单元应用于行中所有未聚合的元素,就像使用元组作为键一样)。您必须合计lat/long,然后确定要保留哪一个。假设您只需要任何一个lat/long,请尝试使用此选项代替您的返回线:

WITH stranger, COLLECT(l) AS locs
WITH stranger, HEAD(locs) AS l
RETURN stranger.name, l.lat, l.lon
如果要根据特定条件(如最近或最近)选择单个lat/long,可以将
HEAD()
调用替换为
REDUCE()