【问题标题】:Cypher virtual nodes to aggregate many to many relationshipsCypher 虚拟节点聚合多对多关系
【发布时间】:2021-12-02 14:12:04
【问题描述】:

我有 8000 个作者节点和 2000 个书籍节点。每个作者都有一个国家/地区属性,每本书可以由许多作者共同创作。

我试图通过将一个国家的所有作者分组到一个名为 Country 的单个虚拟节点中来显示哪些国家在书籍上进行了合作。然后,我需要根据 CountryA 的每位作者与 CountryB 的作者发表文章的次数来创建国家之间的虚拟关系。

我有一些查询正在做一些事情,但无法完全达到我想要的效果。这是我尝试过的方法和结果:

MATCH (a1:Author)-->(p:Paper)<--(a2:Author)
WHERE a1.country <> a2.country
WITH apoc.create.vNode(['Country'], {name: a1.country}) as Country1,  apoc.create.vNode(['Country'], {name: a2.country}) as Country2, count(p) as numCollabs
RETURN DISTINCT Country1, Country2, apoc.create.vRelationship(Country1, 'COLLABORATED_WITH', {numCollabs: numCollabs}, Country2) LIMIT 25

这显示了许多重复的国家(我假设每个作者有 1 个而不是汇总作者),并且每个关系上的 numCollabs 始终为 1。

我也试过这个:

MATCH (a: Author)
WITH a.country as country, count(*) as count
RETURN apoc.create.vNode(['Country'], {name: country, authors: count}) as countries

这为我提供了正确的国家数量并显示了该国家/地区的作者数量...但是,我无法弄清楚如何创建 vRelationship,它将显示每个国家/地区与其他国家/地区合作的次数。

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    试试这个。我试图使示例 here 适应您的数据。

    MATCH (a:Author) 
    WITH collect(distinct a.country) as countries
    WITH [cName in countries | apoc.create.vNode(['Country'],{name:cName})] as countryNodes
    WITH apoc.map.groupBy(countryNodes,'name') as countries
    MATCH (a1:Author)-->(p:Paper)<--(a2:Author)
    WHERE a1.country < a2.country
    WITH a1.country AS countryName1, 
    a2.country as countryName2, 
    count(distinct p) as numCollabs, countries
    RETURN countries[countryName1] as country1, 
    countries[countryName2] as country2, 
    apoc.create.vRelationship(countries[countryName1], 'COLLABORATED_WITH', {numCollabs: numCollabs}, countries[countryName2]) LIMIT 25
    

    【讨论】:

    • 感谢您的帮助!肯定更近。上面的答案会引发错误,因为 numCollabs 未定义。一旦我将 num collabs 添加回第二个 WITH 中,我得到了一个很好的结果,但现在唯一的问题是每个国家/地区仍然有多个节点......即,我为每个与英国合作的国家/地区都有一个英国节点(所以 50+ england 节点),而不仅仅是一个 rels 到多个国家的英国节点。我确定我只是在某个地方需要一个 Distinct,我只是不知道该放在哪里哈哈。
    • 对不起!已编辑以解决该问题。
    • 非常感谢。只需将“国家作为国家”添加到最后以使其在返回中可用。否则会将其标记为正确。再次感谢! :)
    • 好电话。以防未来用户需要时进行编辑。
    • 抱歉跟进。我想知道是否可以修改此查询以将其他属性从作者节点添加到虚拟节点......例如,作者节点也有纬度和经度数据。这些可以像国名一样收集和添加吗?我已经尝试了各种方法来做到这一点,但没有任何乐趣。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 2020-09-02
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多