【问题标题】:Cypher: how to navigate graph to find the right pathCypher:如何导航图以找到正确的路径
【发布时间】:2016-06-14 07:41:02
【问题描述】:

我是 Cypher 的新手,我正在努力学习如何正确导航图表。 我有这样的情况:2个用户关联了相同的服务,该服务可通过帐户访问。因此,用户 'usr01' 可以使用帐户 'acct01' 访问服务 'srv01';用户“usr02”可以使用帐户“acct02”访问服务“srv01”。 目的是提取 2 条这样的记录:

usr01 - srv01 - acct01
usr02 - srv01 - acct02

所以,我执行了这些查询:

  • 节点的创建:

    create (s:XService {serviceId:'srv01'}) return s;
    
    create (u:XUser {userId:'usr01'}) return u;
    
    create (u:XUser {userId:'usr02'}) return u;
    
    create (u:XAccount {accountId:'acct01'}) return u;
    
    create (u:XAccount {accountId:'acct02'}) return u;
    
  • 建立关系:

    MATCH (u:XUser{userId:'usr01'}), (s:XService {serviceId:'srv01'}), (a:XAccount {accountId:'acct01'})
    CREATE (u)-[:HAS_SERVICE]->(s)-[:HAS_ACCOUNT]->(a)
    
    MATCH (u:XUser{userId:'usr02'}), (s:XService {serviceId:'srv01'}), (a:XAccount {accountId:'acct02'}) 
    CREATE (u)-[:HAS_SERVICE]->(s)-[:HAS_ACCOUNT]->(a)
    

我收到的图表结果是this

如果我执行这个查询 - 从用户 usr01 开始:

MATCH (u:XUser {userId: 'usr01'}) OPTIONAL MATCH (u)-[:HAS_SERVICE]->(s:XService) OPTIONAL MATCH (s)-[:HAS_ACCOUNT]->(a:XAccount) 

返回 u.userId、s.serviceId、a.accountId;

我得到this结果:

那么,我怎样才能获得上述结果(usr01 - srv01 - acct01)而不是我收到的笛卡尔积? 提前致谢

【问题讨论】:

    标签: graph neo4j navigation relationship


    【解决方案1】:

    问题是当你添加服务和帐户之间的关系时,你并没有表明与用户的关联关系。作为解决方案,您可以制作一个智能节点“访问规则”:

    MERGE (s:XService {serviceId:'srv01'})
    
    MERGE (u1:XUser {userId:'usr01'})
    MERGE (ua1:XAccount {accountId:'acct01'})
    MERGE (u1)-[:can_access]->(ca1:AccessRule)-[:to_service]->(s)
    MERGE (ca1)-[:with_account]->(ua1)
    
    MERGE (u2:XUser {userId:'usr02'})
    MERGE (ua2:XAccount {accountId:'acct02'})
    MERGE (u2)-[:can_access]->(ca2:AccessRule)-[:to_service]->(s)
    MERGE (ca2)-[:with_account]->(ua2)
    

    还有一个查询:

    MATCH (u:XUser {userId: 'usr01'})
    OPTIONAL MATCH ps = (u)-[:can_access]->(ca1:AccessRule)-[:to_service]->(s:XService)
    OPTIONAL MATCH pa = (ca1)-[:with_account]->(a:XAccount)
    RETURN u, ps, pa
    

    【讨论】:

    • 它似乎工作正常!非常感谢!
    猜你喜欢
    • 2020-10-06
    • 2023-03-09
    • 1970-01-01
    • 2020-11-29
    • 2021-10-19
    • 2014-06-04
    • 2020-08-01
    • 2019-11-26
    • 1970-01-01
    相关资源
    最近更新 更多