2014-11-09 1 views
2

Кажется, я слишком устал, чтобы найти решение, может быть, у кого-то есть намек на меня.neo4jphp: Cypher и Resultset отличаются

Я построил график в Neo4J, который я подключаю через neo4jphp (каждый человек). Используя java-браузер, график выглядит нормально, каждый пользователь существует один раз и может иметь несколько групп, к которым он принадлежит.

При создании пользователя я использую 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; 

Это хорошо работает, как я вижу правильное количество пользователей, даже когда я повторно отправить запрос или перезагрузить страницу.

Пользователей связаны с запросом к группам как этого

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); 

Проверки это в графическом интерфейсе пользователя Neo4j показывает правильный график (по крайней мере, от того, что можно видеть). У меня есть правильное количество пользователей и их отношения.

Когда я запрашиваю график непосредственно Cypher в графическом интерфейсе браузера, как этот

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

я получаю правильное количество пользователей.

Когда я использую neo4jphp lib (каждый человек), я получаю некоторых пользователей double - набор результатов имеет несколько элементов с одним и тем же пользователем. Я не мог понять, почему они ведут себя по-другому, но я полагаю, что я мог каким-то образом испортить отношения. Но все же мне интересно, почему тот же запрос cypher возвращает разное количество записей, когда вы отправляете его через графический интерфейс или через everyman lib, и мне понадобится подсказка о том, как изменить, возможно, запросы, чтобы убедиться, что я получаю только одну запись на пользователя в каждом пользователь только один раз подключается к группе LOCAL_USER.

Спасибо, что выталкивали меня в нужное русло.

ответ

3

Я думаю, вы получите дубли, потому что у вас есть несколько путей (например, несколько команд) для пользователя, использования RETURN distinct user

Для вашего оператора импорта, вы делаете это неправильно наоборот, вместо того, чтобы ваш подход.

MERGE уникальным идентификатором (например входа в систему в вашем случае) и установить другие свойства с 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

 Смежные вопросы

  • Нет связанных вопросов^_^