创建与name作为变量的关系。 (RDBMS到Neo4J迁移)

时间:2016-05-16 22:57:35

标签: neo4j cypher

我尝试将当前数据集迁移到Neo4J并且到目前为止相当成功,直到我遇到此问题。我试图在2节点之间创建一组关系,其中关系的名称是变量。在我的MySQL数据库中,我有一个Role对象,它映射到一对(Resource,Action),因此我尝试使用Neo4J等数据模型将其转换为(Role)-[Action]->(Resource)。这就是我所拥有的,但这似乎不是有效的语法:

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///roletoresourceaction.csv" AS row
MATCH (role:Role {roleId: row.ROLE_ID})
MATCH (resource:Resource {resourceId: row.RESOURCE_ID})
MATCH (action:Action {actionId: row.ACTION_ID})
MERGE (role)-[r:action.name]->(roleAsResource)

非常感谢您提供的任何帮助。感谢。

2 个答案:

答案 0 :(得分:1)

Neo4j 3.x添加了对apoc procedures的支持(必须先将其安装在服务器上才能使用)。

使用apoc过程apoc.create.relationship,您能够执行相当于MERGE 动态关系类型的操作。 Cypher语言本身仅支持静态关系类型的创建/合并。

希望这适合你:

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///roletoresourceaction.csv" AS row
MATCH
  (role:Role {roleId: row.ROLE_ID}),
  (resource:Resource {resourceId: row.RESOURCE_ID}),
  (action:Action {actionId: row.ACTION_ID})
OPTIONAL MATCH (role)-[rel]->(resource)
WITH role, resource, action, COLLECT(TYPE(rel)) AS relTypes
WHERE NOT action.name IN relTypes
CALL apoc.create.relationship(role, action.name, NULL, resource) YIELD newRel
RETURN role, resource, newRel;

OPTIONAL MATCHWHERE子句在允许apoc.create.relationship创建之前验证该关系尚不存在。

ASIDE:我也希望使用apoc.path.expand过程而不是OPTIONAL MATCH子句(带有一些额外的更改),但该过程当前似乎在查询失败时中止查询找到匹配项 - 即使测试NULL的返回路径也无济于事。

答案 1 :(得分:0)

此解决方案适合我

LOAD CSV WITH HEADERS FROM "file:///roletoresourceaction.csv" AS row
MATCH
  (role:Role {roleId: row.ROLE_ID}),
  (resource:Resource {resourceId: row.RESOURCE_ID}),
  (action:Action {actionId: row.ACTION_ID})
OPTIONAL MATCH (role)-[rel]->(resource)
WITH role, resource, action, COLLECT(TYPE(rel)) AS relTypes
WHERE NOT action.name IN relTypes
CALL apoc.create.relationship(role, action.name, NULL, resource)      YIELD rel
RETURN role, resource, rel;