我尝试将当前数据集迁移到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)
非常感谢您提供的任何帮助。感谢。
答案 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 MATCH
和WHERE
子句在允许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;