2017-12-20 10 views
0

안녕하세요 저는 소셜 네트워크를 만들고 싶습니다. 현재 나는 친구들에게 친구들을 추천 할 수 있도록 '친구의 친구'를 표시하려고합니다. Node.js 서버에서 Neo4j 쿼리를 구현하고 있습니다. 문제는 현재의 Cypher 구문에 구문 오류가 발생한다는 것입니다. 누군가가 쿼리를보고 무엇이 잘못되었는지를 알 수 있기를 바랍니다.Cypher를 사용하여 Neo4j의 친구들 만 친구로 얻는 방법

사이퍼 구문 :

MATCH (n:User{mongoId: {idNeo}}) 
MATCH n-[:FRIENDS_WITH*2]-m 
WHERE NOT n-[:FRIENDS_WITH]-m 
RETURN m 

전체 경로 : 그래프 패턴의 노드 주위

routes.get('/users/friendsoffriends/:id', function(req, res) { 
    //res.contentType('application/json'); 
    var ids = []; 
    const id = req.param('id'); 

    session 
    .run("MATCH (n:User{mongoId: {idNeo}}) MATCH n-[:FRIENDS_WITH*2]-m WHERE NOT n-[:FRIENDS_WITH]-m RETURN m", {idNeo: id}) 
    .then(function(result) { 
     result.records.forEach(function(record){ 
     ids.push(record._fields[0].properties.mongoUserId); 
     }); 
     console.log(ids); 
     return ids; 
    }) 
    .then((ids)=>{ 
     User.find({_id: { $in: ids}}) 
      .then((blogPost) => { 
      res.status(200).json(blogPost); 
     }) 
    }) 
    .catch((error) => { 
     res.status(400).json(error); 
    }) 
}); 

답변

0

귀하의 사이퍼 쿼리가없는 괄호. 사용해보기 :

MATCH (n:User{mongoId: {idNeo}}) 
MATCH (n)-[:FRIENDS_WITH*2]-(m) 
WHERE NOT (n)-[:FRIENDS_WITH]-(m) 
RETURN m 
+0

감사합니다. 바보 같은 실수입니다. 결과에서 n이 어떻게 제외 될 수 있는지 알고 있습니까? 이제 친구 A의 친구를 알고 싶으면 사람 A 자신도 나타납니다. – Mike

+0

여러 노드가 있습니까? 동일한 두 노드간에 FRIENDS_WITH 관계가 있습니까? 그것이 * 2 확장이 시작 노드로 돌아 가기 위해 알고있는 유일한 방법입니다. 그것은 모델링 문제가 될 것 같아? 그렇지 않으면 그래프에 맞으면 WHERE 절에'AND n <> m'을 추가하십시오. – InverseFalcon

+0

아래 링크를 참조하십시오. https://stackoverflow.com/questions/19032147/cypher-travel-in-several-crossed-chained-list 아래 질문을 실행 해 보았지만 나에게 도움이되지 못했습니다. 누군가 나를 도울 수 있습니까? Match u : 학생 - [: FRIEND * 0..1] -> 친구 : 학생 어디 u.id = 84 친구와 친구 - [rel : TIMELINE *] -> 활동 여기서 모두 어디 r.idUser = id (친구) 반환 friend.me.fullName – Satish

관련 문제