2

似乎我太累了,找不到解决方案,也许有人对我有提示。

我在 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 的 GUI 中检查这一点会显示正确的图表(至少从我所见)。我有适量的用户和他们的关系。

当我像这样在浏览器 GUI 中直接通过 Cypher 查询图形时

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

我得到正确数量的用户。

当我使用 neo4jphp 库(每个人)时,我收到一些用户双倍 - 结果集具有相同用户的多个元素。我无法弄清楚为什么他们的行为不同,但我认为我可能以某种方式搞砸了关系。但是我仍然想知道为什么当您通过 GUI 或通过everyman lib 发送相同的密码查询时会返回不同数量的记录,我需要提示如何更改查询以确保每个用户只获得一条记录用户仅一次连接到 LOCAL_USER 组。

感谢您将我推向正确的方向。

4

1 回答 1

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;
于 2014-11-09T19:44:12.067 回答