使用 copy 命令进行数据分片

copy 命令可用于在创建数据库副本时过滤数据。在以下示例中,一个示例数据库被分成 3 个分片。

示例 1. 使用 copy 命令过滤数据

示例数据库包含以下数据

(p1 :Person :S2 {id:123, name: "Ava"})
(p2 :Person :S2 {id:124, name: "Bob"})
(p3 :Person :S3 {id:125, name: "Cat", age: 54})
(p4 :Person :S3 {id:126, name: "Dan"})
(t1 :Team :S1 :SAll {id:1, name: "Foo", mascot: "Pink Panther"})
(t2 :Team :S1 :SAll {id:2, name: "Bar", mascot: "Cookie Monster"})
(d1 :Division :SAll {name: "Marketing"})
(p1)-[:MEMBER]->(t1)
(p2)-[:MEMBER]->(t2)
(p3)-[:MEMBER]->(t1)
(p4)-[:MEMBER]->(t2)

数据已通过查询准备好,添加了标签 :S1:S2:S3:SAll,这些标签表示目标分片。分片 1 包含团队数据。分片 2分片 3 包含人员数据。

  1. 创建分片 1,使用

    bin/neo4j-admin database copy neo4j shard1 \
       --copy-only-nodes-with-labels=S1,SAll \ (1)
       --skip-labels=S1,S2,S3,SAll (2)
    1 --copy-only-node-with-labels 属性用于过滤掉不带标签 :S1:SAll 的所有内容。
    2 --skip-labels 属性用于排除为分片过程创建的临时标签。

    生成的分片包含以下内容

    (t1 :Team {id:1, name: "Foo", mascot: "Pink Panther"})
    (t2 :Team {id:2, name: "Bar", mascot: "Cookie Monster"})
    (d1 :Division {name: "Marketing"})
  2. 创建分片 2

    bin/neo4j-admin database copy neo4j shard2 \
       --copy-only-nodes-with-labels=S2,SAll \
       --skip-labels=S1,S2,S3,SAll \
       --copy-only-node-properties=Team.id

    分片 2 中,您希望将 :Team 节点保留为代理节点,以便能够将来自不同分片的信息链接起来。这些节点将被包含在内,因为它们带有标签 :SAll,但您指定了 --copy-only-node-properties 以避免复制分片 1 中的团队信息。

    (p1 :Person {id:123, name: "Ava"})
    (p2 :Person {id:124, name: "Bob"})
    (t1 :Team {id:1})
    (t2 :Team {id:2})
    (d1 :Division {name: "Marketing"})
    (p1)-[:MEMBER]->(t1)
    (p2)-[:MEMBER]->(t2)

    请注意,--copy-only-node-properties 没有过滤掉 Person.name,因为过滤器中未提及 :Person 标签。

  3. 创建分片 3,但使用过滤器 --skip-node-properties,而不是 --copy-only-node-properties

    bin/neo4j-admin database copy neo4j shard3 \
       --copy-only-nodes-with-labels=S3,SAll \
       --skip-labels=S1,S2,S3,SAll \
       --skip-node-properties=Team.name,Team.mascot

    结果是

    (p3 :Person {id:125, name: "Cat", age: 54})
    (p4 :Person {id:126, name: "Dan"})
    (t1 :Team {id:1})
    (t2 :Team {id:2})
    (d1 :Division {name: "Marketing"})
    (p3)-[:MEMBER]->(t1)
    (p4)-[:MEMBER]->(t2)

    如所示,您可以使用 --skip-node-properties--copy-only-node-properties 实现相同的结果。在此示例中,使用 --copy-only-node-properties 更简单,因为只需保留一个属性。关系属性过滤器的工作方式相同。

© . All rights reserved.