使用可变的MATCH标签动态创建Neo4j / Cypher关系

时间:2018-10-23 01:29:07

标签: neo4j

我需要在现有节点之间创建关系,并尝试按照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})"

有人对如何解决这个问题有任何想法吗?我非常接近解决我的问题!任何帮助表示赞赏。约翰

1 个答案:

答案 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(*)

当然,这假定键在具有所有给定标签的所有节点之间是唯一的。如果不是这种情况,那么将需要一种不同的方法。