代表(并递增)Neo4j中的关系强度

时间:2011-12-12 13:05:55

标签: neo4j graph-databases

我想表示Neo4j图中节点之间关系的更改强度。

对于静态图,可以通过在关系上设置“strength”属性来轻松完成:

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

但是,对于需要随时间更新的图形,存在一个问题,因为递增属性的值不能通过原子方式(通过REST接口)完成,因为读取之前-write是必需的。如果正在更新图表以响应传入的流数据,则必须递增(而不仅仅是更新)。

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

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

A knows B
A knows B
A knows B

意味着力量的关系3.

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

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

有更好的方法对此进行建模吗?

3 个答案:

答案 0 :(得分:5)

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

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

您还可以编写一个小型服务器扩展,以便在事务上更新单个关系的权重值。甚至可能对REST API有意义(因为“set single value”操作的添加具有修改单值操作。

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

正文包含delta值(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 

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

取决于您所定位的读写加载量。总图表有多大?