2016-06-14 39 views
1

我是Cypher的新手,我试图学会正确导航图。 我有这样的情况:2用户有关联相同的服务,该服务可通过帐户访问。因此,用户'usr01'可以通过账户'acct01'访问服务'srv01';用户'usr02可以使用账户'acct02'访问服务'srv01'。 目的是提取2条记录是这样的:那么Cypher:如何导航图以找到正确的路径

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) 

RETURN u.userId,s.serviceId,a.accountId;

我获得this结果:

所以,我该怎么做才能获得上述结果(usr01 - acct01 - SRV01),而不是说我已经收到了笛卡尔积? 在此先感谢

回答

0

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

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 
+0

这似乎是正常工作!非常感谢你! – overTheTos

相关问题