我正在开发一个项目,该项目使用图形数据库来保存搜索引擎的点击数据。节点可以是搜索词或网址,边缘包含权重属性,以及搜索导致某人点击该网址的百分比。
Number of times the URL was clicked / Number of times term was searched
我的问题是,当我更新边缘时,百分比将是准确的,但如果我稍后更新搜索项节点并且搜索的计数发生更改,则边缘将不再具有正确的百分比。 Neo4j有没有办法保持参照完整性?像外键型的东西?
答案 0 :(得分:1)
不幸的是,不,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)
。在该方法中,您将检查交易数据以查看它是否感兴趣(并非所有交易都会引起关注)。如果交易更新了搜索词节点或搜索到的计数更改,那么我会进行重新计算,修正权重,你应该做得好。
答案 1 :(得分:1)
以下信息可能会有所帮助。
如果存储了点击次数而不是百分比,则无法获得不一致的数据。例如:
(:Term {id: 1, nSearches: 123})-[:HAS_URL {weight: 2, nClicks: 17}]->(:Url {id: 2})
使用此数据模型,您可以在需要时计算百分比。
例如,要查找对特定网址访问次数最高的10个字词:
MATCH (term:Term)-[r:HAS_URL]->(url:Url {id: 2})
RETURN url, term
ORDER BY r.nClicks/term.nSearches DESC
LIMIT 10;
但请注意,反向查询(查找特定术语中访问次数最多的10个网址)甚至不需要您计算百分比!这是因为在这种情况下,百分比都具有相同的分母。因此,您只需使用nClicks
进行排序:
MATCH (term:Term {id: 1})-[r:HAS_URL]->(url:Url)
RETURN term, url
ORDER BY r.nClicks DESC
LIMIT 10;