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

DNA*_*DNA 9 neo4j graph-databases

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

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

  A --knows--> B
       |
     strength
       |
       3
Run Code Online (Sandbox Code Playgroud)

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

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

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

A knows B
A knows B
A knows B
Run Code Online (Sandbox Code Playgroud)

意味着力量的关系3.

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

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

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

Mic*_*ger 5

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

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

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

PUT http://localhost:7474/db/data/node/15/properties/mod/foo 
Run Code Online (Sandbox Code Playgroud)

正文包含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 
Run Code Online (Sandbox Code Playgroud)

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