如何将节点 属性 转换为虚拟节点并生成 [虚拟] 关系?

How can I convert a node property into a virtual node and generate a [virtual] relationship?

我目前正在学习密码学,但正在努力弄清楚如何完成以下任务。

我的数据

我在 Neo4j 中有一组具有属性的节点。这些属性很少使用,因此拥有实际节点没有多大意义。我下面的示例是国家/地区节点列表,其中包含 属性 的名称和大陆。我们不经常使用大陆,但它仍然存在以供参考。

[
    {
        name: "Australia",
        continent: "Oceania"
    },
    {
        name: "Canada",
        continent: "North America"
    },
    {
        name: "New Zealand",
        continent: "Oceania"
    },
    {
        name: "United States",
        continent: "North America"
    }
]

我想要的

我们要生成的是每个大陆的虚拟节点 + 关系,这样我们就可以看到哪些国家属于哪些大陆。因此,每个大陆一个节点,每个国家一个节点,从一个大陆到内部国家有多种关系。

我有什么

到目前为止我所拥有的在下面 - 但它只是为我找到的每个大陆值提供了断开连接的大陆节点,而没有对它们进行分组。

Match (c:Country)
CALL apoc.create.vNode(['Continent'],{name:c.continent}) yield node as s
Return c, apoc.create.vRelationship(s,'HAS_COUNTRY',{},c), s

如何使用 cypher 查询以生成虚拟节点和关系以及特定节点上的组?

在您的查询中,每行生成一个大陆,因此生成了 4 个大陆,这就是为什么您会看到断开连接的大陆。

您需要将同一大陆的国家组合在一起,并只为它们创建大陆

MATCH (c:Country)
WITH c.continent AS continent, collect(c) AS countries
CALL apoc.create.vNode(['Continent'],{name: continent}) yield node AS s
UNWIND countries AS c
RETURN c, s, apoc.create.vRelationship(s,'HAS_COUNTRY',{},c)