Neo4j加载与未知标签的数据关系

时间:2016-06-29 18:21:48

标签: neo4j

我有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)

2 个答案:

答案 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

该过程采用关系类型的参数,允许创建动态关系类型。