【问题标题】:Finding path using Cypher queries in neo4j在 neo4j 中使用 Cypher 查询查找路径
【发布时间】:2014-10-21 09:10:32
【问题描述】:

我使用的是neo4j 2.1.2 版社区版。我在使用密码找到我正在寻找的路径时遇到了一个问题。 我在 csv 文件中有数据,并使用 LOAD CSV 选项将数据加载到 neo4j 数据库中。 数据如下:

使用的查询:

LOAD CSV WITH HEADERS FROM "file:C:\\WorkingFolder\\Neo4j\\EDGE_Graph_POC\\newdata\\test.csv " as file
MERGE (role:Role {Role:file.RoleName})
MERGE (u:User {User:file.UserName})
Merge (c:Country {Country:file.Country})
MERGE (s:State {State: file.State})
MERGE (a:Address {Address:file.Address})
MERGE (comp:Company {Company: file.Company})

MERGE (u)-[:Has]->(role)-[:GivenAccess_To]->(a)-[:Present_IN]->(s)-[:Belongs_TO]->(c)- [:Comes_Under]->(comp)

使用的数据文件:

结果图:

然后,我将两个地址合并为一个具有如下关系的地址,并授予名为“Susan Smith”的用户访问新合并地址的权限,如下所示: 图形:

我面临的问题: 在这里,如果有人想查看属于哪个国家和州的合并地址,还想查看哪个用户被授予访问权限。此外,在上图中,我已经标记了我正在寻找的路径。

我用来获取路径的查询是:

match path = (x)-[r1:Merged_TO]->(y)
with y
match path1  = (u:User)-[:Has]->()-[:GivenAccess_To]->(y)-[:Present_IN]->(s)-[:Belongs_TO]->(b)-[:Comes_Under]->(comp)
return path1;

输出图表:

但在这里我应该只获取一个名为Susen Smith 的用户,但获取所有连接到Publisher 节点的用户。那么我怎样才能获得这些信息。

预期图表是: **NOTE :** 在这里我不想传递用户名。当我进入 Merged_TO 关系时,我应该得到新的合并节点和应该访问该节点的用户信息。

我该怎么做?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    我相信您的模型已设置为允许所有发布者访问地址而不是特定人员。

    在您的原始导入中,这发生在片段中:

    (u)-[:Has]->(role)-[:GivenAccess_To]->(a)
    

    也许应该是:

    (u)-[:HAS]->(role), (u)-[:GivenAccess_To]->(a)
    

    这将使访问不依赖于角色,而是依赖于用户。然后,您可以使用您的查询稍作调整(但它不会包含角色)。

    MATCH (x)-[r1:Merged_TO]->(y)
    WITH y
    MATCH path1  = (u:User)-[:GivenAccess_To]->(y)-[:Present_IN]->(s)-[:Belongs_TO]->(b)-[:Comes_Under]->(comp)
    return path1;
    

    更新:角色明确后。
    如果用户无权访问地址,并且角色无权访问地址,但它是特定角色中的用户,那么您将不得不添加进一步的级别的间接性。比如:

    ...
    MERGE (u)-[:IN_USER_ROLE]->(ur:UserRole)<-[:HAS_ROLE]-(role)
    (ur)-[:GivenAccess_To]->(a)
    ...
    

    现在要取回地段,您可以使用以下内容:

    MATCH (x)-[r1:Merged_TO]->(y)
    WITH y
    MATCH path1  = (u:User)-[:IN_USER_ROLE]->(ur:UserRole)-[:GivenAccess_To]->(y)-[:Present_IN]->(s)-[:Belongs_TO]->(b)-[:Comes_Under]->(comp)
    MATCH (ur)<-[:HAS_ROLE]-(role)
    return path1, role;
    

    【讨论】:

    • 感谢您的建议。
    • 重要的是您可以在屏幕截图中看到黄色节点连接到红色节点。听起来您希望蓝色节点连接到红色节点。
    • 感谢您的建议。你说的对。在建模本身时,我会像你所说的那样做。现在它完全没问题。再次感谢。如果我在寻找路径时遇到一些问题,我会告诉你
    • 即使我尝试了您提供的解决方案,但是当我尝试获取该特定用户的角色信息时,再次获取该用户的所有角色。但我只想要一个分配给用户“Susan Smith”的角色,用于合并地址。希望你理解这个场景。那我该怎么做呢?
    • 好吧,虽然我建议将您的查询分解为单独的路径以避免真正昂贵的遍历,但您希望通过以下方式实现:MATCH path1 = (role)&lt;-[:HAS]-(u:User)-[:GivenAccess_To]-&gt;(y)-[:Present_IN]-&gt;(s)-[:Belongs_TO]-&gt;(b)-[:Comes_Under]-&gt;(comp)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多