Database 使用Neo4j的参照完整性

Database 使用Neo4j的参照完整性,database,graph,neo4j,Database,Graph,Neo4j,我正在做一个项目,它使用一个图形数据库来保存搜索引擎的点击数据。节点可以是搜索词或URL,边缘具有权重属性,搜索导致有人单击该URL的次数百分比 单击URL的次数/搜索术语的次数 我的问题是,当我更新边缘时,百分比将是准确的,但是如果我稍后更新搜索词节点,并且搜索计数发生变化,边缘将不再具有正确的百分比。Neo4j中有没有保持引用完整性的方法?像外键类型的东西 不幸的是,否,neo4j不支持此功能。您仍然可以使用以下两种方法中的一种来执行此操作。我会告诉你它们都是什么,然后再做个推荐 相对于关系

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

单击URL的次数/搜索术语的次数


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

不幸的是,否,neo4j不支持此功能。您仍然可以使用以下两种方法中的一种来执行此操作。我会告诉你它们都是什么,然后再做个推荐

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

选项1-功能强大的Max De Marzi,描述了如何在neo4j中触发。破坏惊喜的是,JavaAPI中有一个
TransactionEventHandler
。当正确的交易发生时,你可以抓住它并做额外的事情

选项2-服务器提供了一个可供您自己编写的选项。这是一把大锤子,它几乎可以做任何事情,但它也更难挥舞


我建议您查看Max的帖子和
TransactionEventHandler
。然后,您可以在提交后实现
公共void(TransactionData TransactionData,对象o)
。在该方法中,您将检查事务数据,以查看它是否是感兴趣的内容(并非所有事务都感兴趣)。如果事务更新了搜索词节点或搜索计数发生了变化,那么我会重新计算,确定权重,您应该会表现良好。

以下信息可能会有所帮助

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

(: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;