我正在构建一个系统,用户可以使用其中一个提供商进行身份验证 - 例如谷歌,Twitter,Facebook等
在我的数据存储中,我将其建模为每个用户记录具有:USER节点,a:每个身份验证提供程序的AUTH_PROVIDER节点,然后是以下关系:USER到:AUTH_PROVIDER,用于用户身份验证详细信息供应商。这很有效。
我还有一个DAO方法,可以通过内部用户ID加载用户,该用户ID返回一个对象,其中包含与用户相关的所有提供者的详细信息。这也很有效。对此的查询只是
MATCH (u:USER{id:{id}})-[r:AUTHENTICATED_BY]->(p:AUTH_PROVIDER)
RETURN u AS user, COLLECT({auth:r, provider:p}) AS providers
我现在正在尝试 - 并且正在努力 - 做一个DAO方法来加载相同的用户记录,但由提供者链接解决。因此,例如,在提供商“google”处加载ID为“abcde”的用户的用户详细信息。
我已经某事正在工作,但这并不好。
MATCH (p:AUTH_PROVIDER{id:"google"}), (u:USER)-[r:AUTHENTICATED_BY]->(p1:AUTH_PROVIDER)
WHERE (u)-[:AUTHENTICATED_BY{id:"abcde"}]->(p)
RETURN u AS user, COLLECT({auth:r, provider:p1}) AS providers
特别是,Neo4J浏览器警告我“此查询在断开连接的模式之间构建笛卡尔积”
有没有更好的方法来实现同样的目标?特别: *查找:由特定关系链接到特定:AUTH_PROVIDER节点的USER节点 *返回:USER节点和所有:与之相关的AUTH_PROVIDER节点
我尝试过的其他事情 - 我没有写下来 - 要么只返回一个匹配的:AUTH_PROVIDER节点,要么返回所有其他节点:AUTH_PROVIDER节点,但绝不会返回完整集。
干杯
编辑:这将创建一些测试数据以显示我的意思:
CREATE
(u1:USER{name:"Graham"}),
(u2:USER{name:"Bob"}),
(p1:AUTH_PROVIDER{id:"google"}),
(p2:AUTH_PROVIDER{id:"twitter"}),
(p3:AUTH_PROVIDER{id:"facebook"}),
(u1)-[:AUTHENTICATED_BY{id:"123"}]->(p1),
(u1)-[:AUTHENTICATED_BY{id:"456"}]->(p2),
(u1)-[:AUTHENTICATED_BY{id:"789"}]->(p3),
(u2)-[:AUTHENTICATED_BY{id:"abc"}]->(p1),
(u2)-[:AUTHENTICATED_BY{id:"def"}]->(p2),
(u2)-[:AUTHENTICATED_BY{id:"ghi"}]->(p3)
答案 0 :(得分:1)
此查询不构建笛卡尔积并返回所需数据:
MATCH (u:USER)-[:AUTHENTICATED_BY{id:"123"}]->(:AUTH_PROVIDER {id:"google"})
MATCH (u)-[r:AUTHENTICATED_BY]->(p:AUTH_PROVIDER)
RETURN u AS user, COLLECT({auth:r, provider:p}) AS providers