【问题标题】:Creating Neo4j/Cypher relationships dynamically with variable MATCH label使用可变 MATCH 标签动态创建 Neo4j/Cypher 关系
【发布时间】:2018-10-23 13:26:47
【问题描述】:

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

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

【问题讨论】:

    标签: neo4j


    【解决方案1】:

    这说明了为什么建议为每个节点类型处理单独的 CSV 文件,这样您就可以随时知道要硬编码到查询中的标签。

    这是 Cypher 的要求,因为当标签被硬编码时,规划器利用数据库中的元数据来帮助如何有效地规划查询执行(动态标签的评估必须在执行期间进行 ...这对于必须在 执行之前计划查询的计划者来说是无用的)。

    对于这种情况,最好为添加的每种类型的所有节点添加第二个更通用的标签,然后使用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(*)
    

    这当然假设键在具有所有给定标签的所有节点中是唯一的。如果不是这种情况,则需要采用不同的方法。

    【讨论】:

    • 谢谢 InverseFalcon!我是 Neo4j 新手,但我想我理解你的回复。幸运的是,我确实已经有了一个“全球”标签(“EOI”),而且我的密钥是独一无二的,所以我所要做的就是 'CREATE INDEX ON :EOI(key)' 。我还需要在 apoc.create.relationship 参数中添加一个 {}。否则,它起作用了!我确实有一条评论——我正在为一个具有 10^^4 种对象和 10^^9 个对象实例的系统建模。因此,每种类型的单个文件的想法是不可能的。再次感谢。约翰
    • 明白。拥有通用标签仍然是这里的关键。要在 MATCH 之后动态添加标签,您可以使用 apoc.create.addLabel(),这应该可以解决问题
    猜你喜欢
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    相关资源
    最近更新 更多