3

我在节点之间有重复的关系,例如:

A ->{weight: 1} B
A ->{weight: 1} B
A ->{weight: 1} B

我想将这些关系合并为一个形式的关系: A->{weight: 3} B 用于我的整个图表。

我尝试了类似以下的方法:

start n = node(*) 
match (n)-[r:OCCURENCE]->()
Set r.weight = count(*)
count(*)

但是我的图非常大,并且通过此查询,每个节点 A 和 B 的边都更新了两次。此外,旧的关系不会被删除。不知道如何在一个查询中对这两个方面进行建模。希望有人可以提供帮助。

编辑:

用 node( ) 和 relationship( ) 尝试了一些其他查询,例如

start n = node(*) match ()-[r:OCCURENCE]->() set n.SumEdgeWeight = sum(r.weight)

他们的处理速度非常慢。当我需要更新所有节点时,还有其他更快的方法吗?我在 Neo4j 社区中找到了这个主题 [1]。我的查询是否有可能使用 java 核心 api 更快地运行?

[1] https://groups.google.com/forum/#!topic/neo4j/4SSxvNsuQsY

问候。

4

2 回答 2

9

node(*)您可以从您所追求的更具体的模式开始,而不是从匹配每个节点的非常通用的模式 ( ) 开始A-[:OCCURRENCE]->B。这可能会加快速度。

您可以聚合权重值(您似乎在编辑中朝着那个方向移动,但您将权重聚合设置为节点上的属性),而不是计算节点以得出聚合权重。也许对于您的数据,所有关系的权重都为 1,如果可以的话,某种计数可能会起作用(您可以尝试计算关系而不是节点),但可能值得进行不产生正确结果的查询偶然。这样的查询也适用于不同的权重值,例如,如果您将来导入更多数据并需要合并新的[OCCURRENCE]关系,可能权重为 1,与已经合并并到位的关系。

你能试试这样的东西吗?

MATCH (A)-[r:OCCURRENCE]->(B)
WITH A, COLLECT(r) as oldRels, B, SUM(r.weight) as W
FOREACH(r IN oldRels | DELETE r)
WITH A, W, B
CREATE (A)-[O:OCCURRENCE {weight:W}]->(B);

我将此查询的含义类似于:对于A-[r:OCCURRENCE]->B图中的所有模式,COLLECT关系并带来该集合WITH,以便以后可以将其删除。还要带上WITH相关节点和SUM关系的权重。FOREACH旧关系,删除它,WITH只带两个节点和聚合权重。创建一个新关系并将权重设置为聚合权重。

于 2013-09-24T10:33:31.893 回答
2

虽然这是一个老问题,但这里可以使用一些新的 apoc 功能。你需要为你的 neo 版本安装 apoc 插件。

MATCH (A)-[r:OCCURRENCE]->(B) 
WITH  A,B,collect(distinct(r.weight)) as values, count(r) as relsCount
MATCH (A)-[r:OCCURRENCE]->(B)
WHERE size(values) = 1 AND relsCount > 1 
WITH A,B,collect(r) as rels
CALL apoc.refactor.mergeRelationships(rels,{properties:"combine"})
YIELD rel RETURN rel

“combine”属性返回数组中每个重复关系的权重,您可以对其求和。或者,您可以先按照前面的示例将总和添加到关系中,然后删除此属性。

更多文档在这里

于 2017-09-20T10:37:05.140 回答