【问题标题】:Cypher query: group to get top n, then loop over all elements and find the shortest path to a member of the top nCypher 查询:分组获取前 n 个,然后遍历所有元素并找到到前 n 个成员的最短路径
【发布时间】:2015-09-12 16:04:56
【问题描述】:

我正在尝试减少包含成对值的大型表(数十亿条记录)的维数。每条记录由一个 cookie 和一个 URL 组成,例如

cookie                                  url
000006A0-AC89-4D96-8091-AAA16A7990CB    www.cnn.com
000006A0-AC89-4D96-8091-AAA16A7990CB    www.bbc.co.uk
000006A0-AC89-4D96-8091-AAA16A7990CB    www.ynetnews.com
00001490-7A5C-4944-B556-0BD5DF8A262A    www.webmd.com
00001490-7A5C-4944-B556-0BD5DF8A262A    www.health.com
00001490-7A5C-4944-B556-0BD5DF8A262A    www.juicingforperfecthealth.com
...                                     ...

大多数降维算法都是为处理数值数据而设计的。 R 的daisy 可以计算分类变量的距离,但这肯定无法扩展。

在没有更好的主意的情况下,我将数据加载到 Neo4j 中。我的计划是编写一个 Cypher 查询,它将所有 URL 合并到几个主要组中。 cookie 与 URL 的关系为 visited

可以返回访问量排名前 n 的 URL:

MATCH (cookie)-[r:visited]->(url)
RETURN (url), count(url)
ORDER BY count(url) DESC
LIMIT 20

现在是棘手的部分:遍历每个 URL 并返回最接近的顶级 URL(即具有最短路径的顶级 URL)。结果如下所示:

url                                 closest_top_level_url
www.juicingforperfecthealth.com     www.webmd.com
www.ynetnews.com                    www.cnn.com
...                                 ...

您能否告诉我如何用 Cypher 编写此代码,或者建议一种更明智的方法来减少大量字符串对列表的维数?

【问题讨论】:

    标签: algorithm neo4j cypher


    【解决方案1】:

    您有一个由cookieurl 组成的二分图,因此根据定义,最接近的url 节点必须距离visited 2 步远。

    这意味着您可以像这样获得最近的网址:

    MATCH (cookie)-[r:visited]->(url)
    WITH url, count(*) as freq
    ORDER BY freq DESC
    LIMIT 20
    MATCH (url)<-[:visited]-(some_cookie)-[:visited]->(closest_top_level_url)
    RETURN url, closest_top_level_url
    

    “降低维度”是另一个问题,虽然不是一个真正的问题,而是一个复杂的问题。这取决于你最终想要达到的目标。我猜你想通过某种相似性/不相似性度量对url 节点进行聚类? IE。如果它们被相同的 cookie 访问,它们应该被组合在一起吗?

    您可以使用二进制 cookie x url 矩阵和不同的聚类方法来做到这一点:https://stats.stackexchange.com/questions/86318/clustering-a-binary-matrix

    在二分图上进行图聚类的方法也很多。

    更新

    从技术上讲,您可以按照评论中的要求进行操作。我会先在最上面的网址上贴一个标签:

    MATCH (cookie)-[r:visited]->(url)
    WITH url, count(*) as freq
    ORDER BY freq DESC
    LIMIT 20
    SET url :Topurl
    

    然后:

    MATCH p = (some_url:url)-[:visited*]-(top_url:Topurl)
    WITH top_url, some_url
    ORDER BY length(p) desc
    LIMIT 1
    CREATE (some_url)-[:CLOSETO]-(top_url)
    

    两个问题:如果您有数十亿行,前 20 个 URL 中的两个 URL 的距离可能会很长。此外,从一个 cookie 到两个“遥远”网址的单次访问会完全改变您的图形结构。

    【讨论】:

    • 非常感谢,@MartinPreusse。此查询的想法是将任何给定的 URL 分配给流行且具有代表性的重要 URL。在问题中,我选择将所有 URL 分配给最常访问的前 20 个 URL 之一,但实际上,这些可以手动选择(例如新闻、体育等)。确实,最近的 URL 总是与另一个 URL 相距 2 步,但它不一定与前 20 个 URL 中的一个相距 2 步。是否可以对查询进行调整以将 URL 分配给最近的 URL “前 20”网址?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2011-04-12
    • 2011-02-10
    • 2016-05-23
    相关资源
    最近更新 更多