我需要在现有节点之间创建关系,并尝试按照youtube创建动态节点和关系:https://www.youtube.com/watch?v=KsAb8QHClNg几次,但我不认为它们涵盖了我的用例。
示例数据:
SOURCE TARGET LABEL TYPE SOURCE_TYPE TARGET_TYPE SOURCE_KEY TARGET_KEY PHLEVEL COLOR SIZE SCOPE
16 1 ERKRS_ROOT DIRECTED ERKRS ROOT ERKRS_R300 ROOT_EC3_800 0 #808080 1 FALSE
12 1 ERKRS_ROOT DIRECTED ERKRS ROOT ERKRS_INT1 ROOT_EC3_800 0 #808080 1 FALSE
51 1 KKBER_ROOT DIRECTED KKBER ROOT KKBER_GVK1 ROOT_EC3_800 0 #808080 1 FALSE
31 1 KKBER_ROOT DIRECTED KKBER ROOT KKBER_6000 ROOT_EC3_800 0 #808080 1 FALSE
71 1 FIKRS_ROOT DIRECTED FIKRS ROOT FIKRS_1000 ROOT_EC3_800 0 #808080 1 FALSE
334 9 KOKRS_ERKRS DIRECTED KOKRS ERKRS KOKRS_2000 ERKRS_IDEA 1 #808080 1 FALSE
335 9 KOKRS_ERKRS DIRECTED KOKRS ERKRS KOKRS_2200 ERKRS_IDEA 1 #808080 1 FALSE
342 9 KOKRS_ERKRS DIRECTED KOKRS ERKRS KOKRS_4500 ERKRS_IDEA 1 #808080 1 FALSE
我已经使用apoc.create.node及其节点文件成功地动态创建了节点。节点标签= SOURCE_TYPE或TARGET_TYPE。节点KEY属性= SOURCE_KEY或TARGET_KEY。关系是LABEL列。
现在,由于MATCH子句不接受我文件中的标签,创建关系受到了挑战-这是我的脚本:
USING PERIODIC COMMIT 500 LOAD CSV WITH HEADERS FROM 'file:///IDES__Edges1.csv' AS line
MATCH (x:line.SOURCE_TYPE {key:line.SOURCE_KEY}), (y:line.TARGET_TYPE {key:line.TARGET_KEY})
CALL apoc.create.relationship(x, line.LABEL, y) YIELD rel RETURN count(*)
我收到此错误...
Neo.ClientError.Statement.SyntaxError: Invalid input '.': expected an identifier character, whitespace, NodeLabel, a property map, ')' or a relationship pattern (line 2, column 15 (offset: 103))
" MATCH (x:line.SOURCE_TYPE {key:line.SOURCE_KEY}), (y:line.TARGET_TYPE {key:line.TARGET_KEY})"
有人对如何解决这个问题有任何想法吗?我非常接近解决我的问题!任何帮助表示赞赏。约翰
答案 0 :(得分:3)
这说明了为什么建议按每种节点类型处理单个CSV文件,因此您始终可以知道要在查询中使用哪种硬编码标签。
这是Cypher的要求,因为当标签进行硬编码时,计划人员可以利用db中的元数据来帮助如何有效地计划查询执行(动态标签的评估必须在执行期间进行) ...对于必须在执行 前计划查询的计划者没有用。
对于这种情况,最好向添加的每个类型的所有节点添加第二个更通用的标签,然后使用key
属性和该通用标签创建索引,并在创建关系时使用该常规标签进行查找。
因此,在应用了常规标签(现在才将其称为:Node)并在:Node(key)上创建索引之后,它就很简单:
USING PERIODIC COMMIT 500 LOAD CSV WITH HEADERS FROM 'file:///IDES__Edges1.csv' AS line
MATCH (x:Node {key:line.SOURCE_KEY}), (y:Node {key:line.TARGET_KEY})
CALL apoc.create.relationship(x, line.LABEL, y) YIELD rel
RETURN count(*)
当然,这假定键在具有所有给定标签的所有节点之间是唯一的。如果不是这种情况,那么将需要一种不同的方法。