如何规范化neo4j cypher中的值
how to normalize value in 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
也许吧?
我们可以稍微改进一下。
一方面,您需要在此处至少使用一个标签,这样您就可以避免执行所有节点扫描。希望您在创建节点时使用标签。如果没有,一定要开始,未标记的节点将 non-performant 用于大多数查询,因为您将使用所有节点扫描。
此外,为了快速进入本地图表,s
上的标签会有所帮助,该标签及其 label
属性 上的索引(不是与实际标签相同,只是让您知道)。
接下来,如果您想确保一个节点至少有一个关系,最好为此使用 WHERE 而不是将其包含在匹配中。这也可以减少基数问题(假设一个用户为多家公司工作),这可能会使您的结果和后续工作量成倍增加(以及丢弃查询的其他部分)。
至于如何汇总所有用户的 max(messages)
,您还需要汇总其他变量,这有点烦人,但没有办法解决。
此外,我更喜欢对大多数变量使用单数形式,并且只对集合使用复数形式,这有助于避免混淆。
这是一个提供更改的示例(假设 s 也是一个 :User 并且在 :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
给定一组结果,我想标准化一个值。
理想世界查询示例:
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
也许吧?
我们可以稍微改进一下。
一方面,您需要在此处至少使用一个标签,这样您就可以避免执行所有节点扫描。希望您在创建节点时使用标签。如果没有,一定要开始,未标记的节点将 non-performant 用于大多数查询,因为您将使用所有节点扫描。
此外,为了快速进入本地图表,s
上的标签会有所帮助,该标签及其 label
属性 上的索引(不是与实际标签相同,只是让您知道)。
接下来,如果您想确保一个节点至少有一个关系,最好为此使用 WHERE 而不是将其包含在匹配中。这也可以减少基数问题(假设一个用户为多家公司工作),这可能会使您的结果和后续工作量成倍增加(以及丢弃查询的其他部分)。
至于如何汇总所有用户的 max(messages)
,您还需要汇总其他变量,这有点烦人,但没有办法解决。
此外,我更喜欢对大多数变量使用单数形式,并且只对集合使用复数形式,这有助于避免混淆。
这是一个提供更改的示例(假设 s 也是一个 :User 并且在 :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