我有4个标签(A,B,C,D)。所有这些都有一个Property {id}。 现在我有一个关系文件,我想加载。每一行都有这种结构:
{id_1},{type_of_relations},{id_2}
如何创建关系?
我的非工作猜测是:
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:/data.csv" AS line
FIELDTERMINATOR ','
MATCH (a:A{id:line.id_1} OR a:B{id:line.id_1} OR a:C{id:line.id_1} OR a:D{id:line.id_1})
MATCH (b:A{id:line.id_2} OR b:B{id:line.id_2} OR b:C{id:line.id_2} OR b:D{id:line.id_2})
MERGE (a)-[:line.type_of_relations]->(b)
答案 0 :(得分:0)
我认为你不能这样做。出于多种原因。
create (f:bar {name:'NewUserA'})
create (f:foo {name:'NewUserA'})
match (f:foo {name:'NewUserA'} or f:bar {name:'NewUserA'}) return f;
代码 无效的输入' o:预期的空白,评论,')'或关系模式(第1行,第32列(偏移:31)) "匹配(f:foo {name:' NewUserA'}或f:bar {name:' NewUserA'})返回f"。
所以无论如何都无法在比赛中出现问题。 如果id是全局唯一的,那么您可以忽略标签并仅匹配id。这将照顾你的'或''问题
match (f) where f.name='NewUserA' match (t) where t.name='NewUserA' return f,t
会给你节点。
话虽这么说,当编码参数化查询时,RELATIONSHIP_TYPE是您无法参数化的项目之一。来自文档: 5.5。参数 [..] 参数不能用作属性名称,关系类型和标签,因为这些模式是编译到查询计划中的查询结构的一部分。 [..]
因此,你可能需要寻找在其他地方构建MERGE作为字符串的方法(awk是你的朋友),然后在shell中运行它。
答案 1 :(得分:0)
您无法在Cypher中参数化关系类型。
但是,您可以使用apoc.create.relationship
中的Neo4j apoc procedures程序执行此操作:
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///file.csv" AS row
MATCH (a) WHERE a.id = row.id_1
MATCH (b) WHERE b.id = row.id_2
CALL apoc.create.relationship(a, row.type_of_relations, {}, b) YIELD rel
RETURN count(*) AS num
该过程采用关系类型的参数,允许创建动态关系类型。