【问题标题】:Referential Integrity with Neo4jNeo4j 的参照完整性
【发布时间】:2016-03-11 22:31:59
【问题描述】:

我正在开展一个项目,该项目使用图形数据库来保存搜索引擎的点击数据。节点可以是搜索词或 URL,边包含权重属性,以及搜索导致有人点击该 URL 的百分比。

Number of times the URL was clicked / Number of times term was searched

我的问题是,当我更新边时,百分比将是准确的,但如果我稍后更新搜索词节点并且搜索计数发生变化,边将不再具有正确的百分比。 Neo4j 中有没有办法保持参照完整性?像外键类型的东西?

【问题讨论】:

    标签: database graph neo4j


    【解决方案1】:

    以下信息可能会有所帮助。

    如果您存储的是点击次数而不是百分比,则无法获得不一致的数据。例如:

    (:Term {id: 1, nSearches: 123})-[:HAS_URL {weight: 2, nClicks: 17}]->(:Url {id: 2})
    

    使用此数据模型,您可以在需要时计算百分比。

    例如,要查找对特定 URL 的访问百分比最高的 10 个字词:

    MATCH (term:Term)-[r:HAS_URL]->(url:Url {id: 2})
    RETURN url, term
    ORDER BY r.nClicks/term.nSearches DESC
    LIMIT 10;
    

    但请注意,反向查询(查找特定术语的访问百分比最高的 10 个 URL)甚至不需要您计算百分比!这是因为在这种情况下,百分比都具有相同的分母。因此,您可以使用nClicks 进行排序:

    MATCH (term:Term {id: 1})-[r:HAS_URL]->(url:Url)
    RETURN term, url
    ORDER BY r.nClicks DESC
    LIMIT 10;
    

    【讨论】:

      【解决方案2】:

      很遗憾,neo4j 不支持这一点。您仍然可以使用以下两种方法之一进行操作。我会告诉你它们都是什么,然后提出建议。

      相对于您的关系数据库,我认为您不是在寻找外键或“参照完整性”——我认为您正在寻找的更像是一个触发器。触发器类似于在数据更改时执行的函数或过程。在您的情况下,最好使用触发函数来重新计算事件边缘上的所有权重百分比。

      选项 1 - 有能力的 Max De Marzi has got you covered there 描述了如何在 neo4j 中执行触发器。令人惊讶的是,Java API 中有一个TransactionEventHandler。当正确的交易类型通过时,您可以抓住它并做额外的事情。

      选项 2 - 服务器提供extension/plugin mechanism,以便您自己编写。这是一把大锤子,它几乎可以做任何事情,但也更难使用。

      我建议您查看 Max 的帖子和 TransactionEventHandler。然后你可以实现public void afterCommit(TransactionData transactionData, Object o)。在该方法中,您将检查交易数据以查看它是否感兴趣(并非所有交易都会感兴趣)。如果交易更​​新了搜索词节点或搜索计数发生了变化,那么我会去重新计算,修正你的权重,你应该会很好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-13
        • 2010-09-26
        • 2013-09-14
        相关资源
        最近更新 更多