Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Neo4j中表示(并增加)关系强度_Neo4j_Graph Databases - Fatal编程技术网

在Neo4j中表示(并增加)关系强度

在Neo4j中表示(并增加)关系强度,neo4j,graph-databases,Neo4j,Graph Databases,我想在Neo4j图中表示节点之间不断变化的关系强度 对于静态图形,可以通过在关系上设置“强度”属性轻松完成此操作: A --knows--> B | strength | 3 但是,对于需要随时间更新的图形,存在一个问题,因为不能以原子方式(通过REST接口)增加属性值,因为需要先读后写。如果正在更新图形以响应传入的流数据,则需要增加(而不仅仅是更新) 我需要确保一次只读取和写入一个REST客户机(外部同步),或者只使用嵌入式API

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

对于静态图形,可以通过在关系上设置“强度”属性轻松完成此操作:

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

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

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

A knows B
A knows B
A knows B
表示一种强度关系3

  • 缺点:只能记录整数强度
  • 优点:不需要先读后写
  • 缺点:(可能)需要更多的存储空间
  • 缺点:(可能)提取值要慢得多,因为必须提取和计算多个关系
是否有人尝试过这种方法,是否会遇到性能问题,特别是在阅读时


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

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

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

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

您还可以编写一个小型服务器扩展,用于以事务方式更新单个关系上的权重值。甚至可能对RESTAPI有意义(因为除了“set single value”操作之外,还有一个modify single value操作)

PUT http://localhost:7474/db/data/node/15/properties/mod/foo 
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 
正文包含delta值(1.5,-10)。另一个想法是用实际操作替换mode关键字

PUT http://localhost:7474/db/data/node/15/properties/mod/foo 
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 

“增量”是什么在非整数的情况下,

< P> HMM有一种不同的方法,但是你可以考虑使用排队系统。我也使用NeN4J REST接口,我正在考虑存储一个不断变化的关系强度。这个项目是在Rails和RESQUE中。每当需要更新NeN4J数据库时,它就会被抛出。由工作人员完成的队列。我只有一个工作人员在Neo4j Resque队列上工作,因此它从不尝试一次执行多个Neo4j更新


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

粗略猜测,我会说有几千万个节点。关系的数量不太确定,但可能是节点数量的一小倍。图形将不断更新,每秒添加或更新数十或数百个实体。读取负载可能相当轻;选择少量节点在指定节点的局部性中,例如.mmh,如果您可以将更新分组到大于一个接一个的事务中,那么您应该具有良好的性能。谢谢-这里有几个有趣的可能性!检查字典后,我认为可以讨论非整数“增量”(尽管您必须明确指定数量)!