2014-11-09 1 views
2

나는 해결책을 찾기에는 너무 피곤해 보인다. 어쩌면 누군가 나에게 힌트를 줄 것 같다.neo4jphp : Cypher와 Resultset이 다르다

나는 neo4jphp (everyman)를 통해 연결하는 그래프를 Neo4J에 만들었습니다. 자바 브라우저를 사용하면 그래프가 좋아 보이는데, 모든 사용자는 한 번 존재하며 그가 속한 그룹이 여러 개있을 수 있습니다. 내가 그들을 피하기 위해 MERGE 사용하는 사용자가 두 배가 될 만드는 동안

-
MERGE (user:PERSON { 
firstname: "Max", 
name: "Muster", 
password:"e52ddddddd9afb7b373f9da437", 
title:"something", 
login:"Nick", 
status:"active" 
}) 
ON CREATE SET user.uuid = "'.uniqid().'" // PHP function for a UUID 
return user; 

처럼 이것은 내가 쿼리를 다시 보내거나 페이지를 다시로드에도 때 사용자의 정확한 수를 확인으로 잘 작동합니다.

사용자가 Neo4J의 GUI이 확인이

MATCH (user:PERSON), (team:GROUP)  
WHERE user.name= "Muster" AND user.firstname="Max" AND team.name="LOCAL_USER" 
CREATE (user)-[:IS_MEMBER_OF {role:"user", status:"active"}]->(team); 

같은 그룹으로 쿼리와 연결되어있는 것은 (내가 볼 수있는 것과 적어도) 정확한 그래프를 보여줍니다. 나는 적절한 양의 사용자와 그들의 관계를 가지고있다. 나는이

MATCH (user:PERSON {status: "active"})-[relation:IS_MEMBER_OF{status:"active"}]->(team:GROUP {name:"LOCAL_USER"}) 
RETURN user 
ORDER BY user.name; 

같은 브라우저 GUI에서 사이퍼 직접 그래프를 조회 할 때

나는 사용자의 정확한 수를 얻을.

neo4jphp lib (everyman)을 사용하면 일부 사용자가 두 번 나타납니다. 결과 집합에는 동일한 사용자가있는 여러 요소가 있습니다. 나는 그들이 다르게 행동하는 이유를 파악할 수 없었지만 어떻게 든 관계를 엉망으로 만들었다 고 가정합니다. 하지만 여전히 동일한 사이퍼 쿼리가 GUI 나 everyman lib를 통해 보낼 때 다른 양의 레코드를 반환하는 이유는 궁금합니다. 어쩌면 쿼리를 변경하여 사용자마다 레코드 하나를 얻는 방법에 대한 힌트가 필요합니다. 사용자는 한 번만 LOCAL_USER 그룹에 연결됩니다.

나를 올바른 방향으로 밀어 주셔서 감사합니다.

답변

3

난 당신이 사용자 가져 오기 문에 대한 사용 RETURN distinct user

, 당신은 길을 잘못 라운드 그것을 여러 경로 (예를 들어, 여러 팀)을 가지고 있기 때문에 대신 당신의 접근 방식의 복식을 얻을 생각합니다.

(귀하의 경우 예 : 로그인) 고유 ID로 병합하고 당신의 쿼리 문자열에 ON CREATE SET ... 또한

사용 매개 변수하지 리터럴 값과 다른 속성을 설정!

MERGE (user:PERSON {login:{login}}) 
ON CREATE SET 
    user.firstname = {firstname}, user.name= {name}, user.password = {password}, 
    user.title={title}, user.status = {status}, user.uuid = {uuid} 
RETURN user; 
+0

감사합니다. 누락 된 링크였습니다! 또한 매개 변수 사용법 및 MERGE 문 변경에 대해 알려 주셔서 감사 드리며 테스트를 통과했습니다. 매우 감사하고 - 너무 빨리 :) +1 – Balael