如何在neo4j cypher中规范化值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在neo4j cypher中规范化值相关的知识,希望对你有一定的参考价值。

给定结果集,我想规范化一个值。

理想世界查询示例:

match (c)<-[:WORKS_FOR]-(u)-[:KNOWS]->(s)
where s.label = "Test"
with u as users
match (users)-[com:SEND]-(otherUsers)
with  users, sum(com.count) as messages
return users, messages / max(messages)

如何从用户那里获得max(messages)UNWIND可能吗?

答案

我们可以稍微改进一下。

首先,您需要在此处使用至少一个标签,以避免执行所有节点扫描。希望您在创建节点时使用标签。如果没有,绝对是开始的,未标记的节点将无法在大多数查询中使用,因为您将使用所有节点扫描。

此外,为了快速进入局部图形,s上的标签会有所帮助,并且该标签上的索引及其label属性(与实际标签不同,只是让您知道)。

接下来,如果要确保节点至少有一个关系,最好为其使用WHERE,而不是将其包含在匹配中。这也可以减少基数问题(例如,如果用户为多家公司工作),这可能会使您的结果和后续工作量增加(以及抛弃查询的其他部分)。

至于如何在所有用户之间聚合max(messages),你还需要聚合其他变量,这有点烦人,但没办法解决它。

此外,我更喜欢在大多数变量中使用单数形式,并且仅对集合使用复数形式,这有助于避免混淆。

这是一个提供更改的示例(假设s也是:用户并且有一个索引:User(label)):

match (user:User)-[:KNOWS]->(s:User)
where s.label = "Test" and ()<-[:WORKS_FOR]-(user)
match (user)-[com:SEND]-()
with  user, sum(com.count) as messages
with collect({user:user, messages:messages}) as usersInfo, 1.0 * max(messages) as total
unwind usersInfo as userInfo
return userInfo.user as user, userInfo.messages / total as percentage

以上是关于如何在neo4j cypher中规范化值的主要内容,如果未能解决你的问题,请参考以下文章

如何往neo4j中批量插入cypher语句

Neo4J 在 Cypher 中创建临时变量

如何忽略 cypher (neo4j) 中 java 存储过程的产量值?

如何优化Neo4J Cypher查询?

如何优化 Neo4J Cypher 查询?

根据 Cypher neo4j 中的属性值总和创建新关系?