9

我想在 Neo4j 图中表示节点之间关系的变化强度。

对于静态图,这很容易通过在关系上设置“强度”属性来完成:

  A --knows--> B
       |
     strength
       |
       3

但是,对于需要随时间更新的图形,存在一个问题,因为增加属性的值不能原子地(通过 REST 接口)完成,因为需要先读后写。如果图形正在更新以响应传入的流数据,则需要递增(而不仅仅是更新)。

我需要确保只有一个 REST 客户端一次读取和写入(外部同步),或者只使用嵌入式 API,以便我可以使用内置事务。这可能是可行的,但似乎很尴尬。

另一种解决方案可能是记录多个关系,没有任何属性,因此“强度”实际上是关系的计数,即

A knows B
A knows B
A knows B

表示强度关系 3。

  • 缺点:只能记录整数强度
  • 优点:无需先读后写
  • 缺点:(可能)需要更多存储空间
  • 缺点:(可能)提取值要慢得多,因为必须提取和计算多个关系

有没有人尝试过这种方法,是否可能会遇到性能问题,尤其是在阅读时?

有没有更好的方法来建模这个?

4

3 回答 3

5

好主意。为了减少存储和多次读取,这些关系可以在以事务方式运行的批处理作业中聚合为一个。

每个 rel 还可以携带一个单独的权重值,其聚合值用作权重。它不必是基于整数的,也可以是负数来表示递减。

您还可以编写一个小型服务器扩展来以事务方式更新单个关系的权重值。甚至可能对 REST API 有意义(因为除了“设置单值”操作之外,还有一个修改单值操作。

PUT http://localhost:7474/db/data/node/15/properties/mod/foo 

正文包含增量值 (1.5, -10)。另一个想法是用实际操作替换 mode 关键字。

PUT http://localhost:7474/db/data/node/15/properties/add/foo 
PUT http://localhost:7474/db/data/node/15/properties/or/foo 
PUT http://localhost:7474/db/data/node/15/properties/concat/foo 

在非整数情况下,“增量”是什么意思?

于 2011-12-13T10:10:39.103 回答
2

嗯有点不同的方法,但你可以考虑使用排队系统。我也在使用 Neo4j REST 接口,并且正在研究存储不断变化的关系强度。该项目在 Rails 中并使用 Resque。每当需要更新 Neo4j 数据库时,它都会被放入 Resque 队列以由工作人员完成。我只有一名工作人员在 Neo4j Resque 队列上工作,因此它永远不会尝试一次执行多个 Neo4j 更新。

这具有额外的好处,即当用户执行触发更新的操作时,不会让用户等待 neo4j 更新。但是,如果您不需要立即使用/显示 Neo4j 更新,这只是一个可行的解决方案(尽管取决于您的工作人员的速度和队列的大小,它应该只需要几秒钟)。

于 2011-12-23T16:09:59.317 回答
1

取决于您所针对的读写负载。总图有多大?

于 2011-12-12T23:07:41.330 回答