Neo4j 计算关系类型的数量,将其作为频率特性添加到边

Neo4j 计算关系类型的数量,将其作为频率特性添加到边,neo4j,cypher,Neo4j,Cypher,我试图在neo4j图中计算不同类型的关系,将它们作为“频率”属性添加到相应的边上(即我有4个e:EX关系类型,因此我希望我的EX类型边有一个e.frequency=4) 到目前为止,我已经使用了以下代码: MATCH ()-[e:EX]-() WITH e, count(e) as amount SET e.frequency = amount RETURN e 对于这段代码,我返回的e.frequency对于所有EX边都是2。也许这里的任何人都知道如何更正此问题?听起来您希望稍后对任何具

我试图在neo4j图中计算不同类型的关系,将它们作为“频率”属性添加到相应的边上(即我有4个e:EX关系类型,因此我希望我的EX类型边有一个e.frequency=4)

到目前为止,我已经使用了以下代码:

MATCH ()-[e:EX]-()
WITH e, count(e) as amount  
SET e.frequency = amount
RETURN e

对于这段代码,我返回的e.frequency对于所有EX边都是2。也许这里的任何人都知道如何更正此问题?

听起来您希望稍后对任何具有该类型的节点快速访问此信息。如果您计划删除或添加图形中的边,您应该意识到数据将很快过时,并且在图形范围内查询以更新图形中每个边上的属性是没有意义的

谢天谢地,Neo4j保存了各种统计数据的事务计数存储,包括每种关系类型的关系数

最容易通过过程调用获取这些信息,无论是在Neo4j本身还是APOC过程中

如果安装了APOC,则可以看到关系类型计数的映射,如下所示:

CALL apoc.meta.stats() YIELD relTypesCount
RETURN relTypesCount
CALL apoc.meta.stats() YIELD relTypesCount
MATCH ()-[r]->()
WITH relTypesCount, r
LIMIT 5
RETURN type(r) as type, relTypesCount[type(r)] as count
如果知道要计数的类型,可以在relTypesCount映射中使用点表示法来获得有问题的值

如果它是动态的(或者作为参数传入,或者在与查询中的关系匹配后获得),则可以使用映射索引表示法获得相关计数,如下所示:

CALL apoc.meta.stats() YIELD relTypesCount
RETURN relTypesCount
CALL apoc.meta.stats() YIELD relTypesCount
MATCH ()-[r]->()
WITH relTypesCount, r
LIMIT 5
RETURN type(r) as type, relTypesCount[type(r)] as count
如果没有APOC,可以使用
db.stats.retrieve('GRAPH COUNTS')
产生数据
,但您必须进行一些额外的筛选,以确保获得给定类型的所有关系的计数,并排除包含开始或结束节点标签的计数:

CALL db.stats.retrieve('GRAPH COUNTS') YIELD data
WITH [entry IN data.relationships WHERE NOT exists(entry.startLabel) AND NOT exists(entry.endLabel)] as relCounts
MATCH ()-[r]->()
WITH relCounts, r
LIMIT 5
RETURN type(r) as type, [rel in relCounts WHERE rel.relationshipType = type(r) | rel.count][0] as count

首先,这里是您的查询所做的

// Match all EX edges (relationships), ignore direction
MATCH ()-[e:EX]-()
// Logical partition; With the edges, count how many times that instance occurred (will always be 2. (a)-[e:EX]->(b) and the reverse order of (b)<-[e:EX]-(a)
WITH e, count(e) as amount
// Set the property frequency on the instance of e to amount (2)
SET e.frequency = amount
// return the edges
RETURN e
尽管如此,一旦创建或删除前边缘,频率就会失效,所以我会打开你的密码,询问边缘计数

此外,在这种简单的情况下,获取关系计数的最佳方法是使用匹配计数,因为此表单帮助Cypher planer认识到它只能从其内部元数据存储中获取边缘计数

MATCH ()-[e:EX]->()
WITH COUNT(e) as c
MATCH ()-[e:EX]->()
SET e.frequency = c
return e

EX
在neo4j术语中是一种关系“类型”。所以,“我有4种e:EX关系类型”没有意义。您的意思是您有4个
EX
关系实例吗?另外,您试图使用
frequency
属性做什么?只是简单地添加一下…Tezra是对的,对于这些琐碎的情况,Cypher方法(没有proc调用)更容易。请记住,要使用计数存储,模式中的关系需要一个方向,计数聚合需要是WITH或RETURN中的唯一内容。有关counts store的用法和限制的更多信息