Neo4j - 查找节点以及一个关系匹配的所有关系

时间:2018-02-08 22:48:57

标签: neo4j cypher

我正在构建一个系统,用户可以使用其中一个提供商进行身份验证 - 例如谷歌,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)

1 个答案:

答案 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