在neo4j中使用Cypher查询查找路径

时间:2014-10-21 09:10:32

标签: neo4j cypher

我正在使用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)

使用的数据文件:

enter image description here

结果图: enter image description here

然后我将两个地址合并为一个地址,其关系如下所示,并且可以访问名为“Susan Smith”的用户。访问新合并的地址,如下所示: 图形: enter image description here

问题我面临: 这里如果有人想查看属于哪个国家和州的合并地址,还要查看哪个用户可以访问。在上图中我也标记了我正在寻找的路径。

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

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;

输出图表 enter image description here

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

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

我该怎么办?

1 个答案:

答案 0 :(得分: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;

更新:Roles澄清之后。
如果用户无权访问地址,并且角色无权访问地址,但是特定角色中的用户具有访问权限,那么您将需要添加更多级别间接的。类似的东西:

...
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;