【问题标题】:An unusual cypher query challenge: finding intersections with nodes grouped by label一个不寻常的密码查询挑战:查找与按标签分组的节点的交集
【发布时间】:2021-09-17 18:02:21
【问题描述】:

我正在尝试找到一个通用(ist)密码查询,而无需指定标签,这将实现以下用例。

  • 用户可以链接到节点,这些节点代表用户配置文件或活动。例如(User)->[:HAS_CLICKED]->(Document),或(User)-[:LIVES_IN]->(Country)
  • 广告可以链接到这些节点中的一个或多个Document-[:x]->Advert

catch 试图找到一个有效的查询来验证以下内容:用户必须与至少一个与广告具有相同标签的节点相关才能看到它。一般架构如下所示:

我查看了 cypher 中的交集和联合技术,包括 apoc.intersection 过程,但它在这种情况下确实有效。

数据库包含大约 6M 的关系,效率至关重要。我们总是尝试为一个用户找到一个随机广告(查询总是以 MATCH (u:User{id:"1"})... 开头。我写了很多不成功的测试,但我不确定我可以用哪种有效的方法来解决这样的问题。任何帮助都是赞赏!

【问题讨论】:

    标签: neo4j cypher graph-databases


    【解决方案1】:

    您是否尝试过类似的方法,两步法,从用户的广告中减去“标签”的标签?

    MATCH (u:User {id:'1'})-->()<--(a:Ad)
    WITH DISTINCT u,a
    WHERE 
         SIZE(apoc.coll.subtract( 
                                  [(a)-->(tag) | labels(tag)[0]],
                                  [(u)-->(tag)<--(a) | labels(tag)[0]]
                                )
             ) = 0
    RETURN a,rand() AS rand
    ORDER BY rand LIMIT 1
    

    【讨论】:

    • 似乎是一种非常有趣的方法,虽然第一个 MATCH 的性能会收集几乎所有的广告......但我可以尝试解决这个想法......!谢了!
    • 为什么你认为第一场比赛会收集到几乎所有的广告?我假设用户的“标签”数量是有限的,所以它只会收集与用户至少有 1 个“标签”的广告。
    • 相反,它会随着用户的活动和用户群的增长而增长......虽然你是对的,它只会收集“仅”1个标签,但实际上它可以来到最后。
    • 我已经将我的头包裹在它周围并对其进行了测试。这正是我一直在寻找的东西!无需比较 ID,因为它们是“事实上的”。现在查询需要很长时间,关于如何优化它的任何线索?
    【解决方案2】:

    一个简单的匿名模式匹配会得到结果,例如:

    MATCH (u:User {id:'1'})-->()<--(a:Ad)
    RETURN DISTINCT a.id, ...
    [ORDER BY] 
    [LIMIT 1]
    

    它需要分析才能了解它在您的数据集上的行为方式,但它不太可能满足您的效率需求。

    强制随机排序会进一步减慢查询速度,例如

    MATCH (u:User {id:'1'})-->()<--(a:Ad)
    WITH a, rand() as sortOrder
    RETURN DISTINCT a.id, ..., sortOrder
    ORDER BY sortOrder ASC 
    LIMIT 1
    

    如果我在我的一个图形数据库(在 m5.xlarge EC2 实例上)尝试类似的操作,其中大约有 35k 'u' 节点、600k 'a' 节点和它们之间的 1700 万条边 - 分析时我看到在 9852 毫秒内总共有 11,054,599 次 db 点击!

    APOC / GDS 路径功能似乎无法满足您的需求。 尽管您可以考虑基于例如编写用户定义的函数。 APOC's Neighbors code

    图表的增长速度和更新频率如何? 只是想知道是否有其他方法(例如预先计算的图嵌入)可以帮助您满足响应时间要求。

    【讨论】:

    • 嗨罗宾,感谢您的回答。不幸的是,匿名模式匹配并不能解决问题,因为它仍然会返回并为第一种情况(第一张图片)做广告,这是不应该的。
    • 哦,是的——我忽略了那个微妙的地方。有多少种不同类型的广告定位节点标签?它们总是强制性的吗?
    • 是的,这很重要! ;-) 理想情况下,有无限数量的标签可用于定位,我的想法是如果我添加新的定位类型标签,我不想更改查询。那是我想要实现的,但目前喜欢10多种。是的,如果附加到广告上,它们始终是强制性的(不过,正如您猜到的那样,按标签组...)
    • 我有一个解决强制标签挑战的想法,方法是确定用户的邻居标签集(在广告的路径上)和广告的目标标签集的 Jaccard 相似性。虽然我需要花一些时间来试验 Cypher 的实现!尚不确定它是否适用于图形数据科学库 Jaccard 实现 (neo4j.com/docs/graph-data-science/current/alpha-algorithms/…)。
    • 嗨 Romain,刚刚重温了这篇文章并看到了来自 @Graphileon 的答案 - 这是我的想法,使用 apoc.coll.subtract 实现比较的好主意。
    猜你喜欢
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    相关资源
    最近更新 更多