Graph Cypher:如何导航图形以找到正确的路径

Graph Cypher:如何导航图形以找到正确的路径,graph,neo4j,navigation,relationship,Graph,Neo4j,Navigation,Relationship,我对Cypher是新手,我正在努力学习正确地导航图表。 我有一个这样的情况:2个用户关联了相同的服务,该服务可以通过一个帐户访问。因此,用户“usr01”可以使用帐户“acct01”访问服务“srv01”;用户“usr02”可以使用帐户“acct02”访问服务“srv01”。 其目的是提取如下2条记录: usr01 - srv01 - acct01 usr02 - srv01 - acct02 因此,我执行了以下查询: 创建节点: create (s:XService {serviceId:

我对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)
    
我收到的图表结果是

如果我执行此查询-从用户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

我得到的结果是:

那么,我如何才能得到上面描述的结果(usr01-srv01-acct01),而不是我收到的笛卡尔积呢?
提前感谢

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

和一个查询:

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

问题是,当您添加服务和帐户之间的关系时,您没有指示与用户的关联关系。作为解决方案,您可以创建智能节点“访问规则”:

和一个查询:

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

它似乎工作正常!非常感谢你!它似乎工作正常!非常感谢你!