连接表之类的多种关系(neo4j)

时间:2017-03-10 21:29:45

标签: neo4j

如何在neo4j中表达以下内容?

匹配或创建用户bob;鲍勃在工作室工作;在工作室,他被允许涂鸦;在工作室,他也被允许输入。

这就是我所拥有的:

MERGE (u:user {name:'bob'})
MERGE (c:company {name: 'studio'})
MERGE (u)-[:works_at]->(c)-[:allowed_to]->(p:permission {name:'doodle'})
MERGE (u)-[:works_at]->(c)-[:allowed_to]->(p:permission {name:'type'})

这不起作用,因为许可成为公司的关系。

此外,是否可以将关系链接起来:

MERGE work=(u)-[:works_at]->(c)
CREATE (work)-[:allowed_to]->(p:permission {name:'doodle'})
CREATE (work)-[:allowed_to]->(p:permission {name:'type'})

在哪里为变量指定关系以便稍后在另一个查询中继续?

2 个答案:

答案 0 :(得分:3)

如何对其进行建模以便公司授予权限?像这样......

MERGE (u:user {name:'bob'})
MERGE (c:company {name: 'studio'})
MERGE (u)-[:works_at]->(c)
MERGE (u)-[:allowed_to]->(p1:permission {name:'doodle'})<-[:GRANTS]-(c)
MERGE (u)-[:allowed_to]->(p2:permission {name:'type'})<-[:GRANTS]-(c)
RETURN *

您无法通过先前在其他查询中创建的标识符/变量来引用对象。您必须在新查询中重新匹配或合并先前创建的对象。

第2部分可以建模如下..

MERGE (u:user {name:'bob'})
MERGE (c:company {name: 'studio'})
MERGE (u)-[:DOES]->(work:Work {start_date: timestamp()} )-[:AT]->(c)
CREATE (work)-[:allowed_to]->(p:permission {name:'doodle'})
CREATE (work)-[:allowed_to]->(p:permission {name:'type'})

答案 1 :(得分:2)

作为替代方案,如果您永远不需要在公司中查找具有特定权限的所有用户,则可以将权限集合维护为关系属性。

MERGE (u:user {name:'bob'})
MERGE (c:company {name: 'studio'})
MERGE (u)-[r:works_at]->(c)
SET r.permissions = ['doodle', 'type']