AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 76921714
Accepted
Leyla Elkhamlichi
Leyla Elkhamlichi
Asked: 2023-08-17 20:51:42 +0800 CST2023-08-17 20:51:42 +0800 CST 2023-08-17 20:51:42 +0800 CST

从列中计算百分比是表 neo4j/Cypher

  • 772

我想计算每种职业的每种技能的百分比。我做了a有不同的节点占用和Soft_skills它们有关系[r:MAPS_TO]该关系有两个属性类型('essentieel','optioneel')和b(这种权重essentieel = 1.0和optioneel = 0.5)

请参阅下面我正在使用的文件的示例

职业 职业代码 技能代码 姓名 类型 乙
博士 sk_565 sk_687 勒伦 选项 0.5
博士 sk_565 sk_687 勒伦 选项 0.5
博士 sk_565 sk_687 勒伦 精华 1.0
博士 sk_565 sk_687 勒伦 精华 1.0

我做了一个查询,可以计算每个职业的总和,请参阅下面的查询:

match (b:BOC_beroep)-[r:MAPS_TO]-(s:Soft_Skill)                                                     
return b.beroepstitel as beroep,                             
sum(toFloat(r.b)) as sum order by sum desc                         
limit 10

这是我的输出

贝罗普 和
多克 5
卡珀 7

知道我想要达到我计算的技能类型的百分比

Dokter have in total 4 skills en the percentage of each skill is 
2/4 * 100 = 50% essentieel 
1/4 * 100 = 25% optioneel 

i was trying to make a new calculation with this query:

  MATCH (b:BOC_beroep)-[r:MAPS_TO]->(s:Soft_skill)
  WITH SUM(toFloat(r.b)) As total
  MATCH (b:BOC_beroep)-[r:MAPS_TO]->(s:Soft_Skill)
  RETURN b.beroepstitel  AS beroep, 
  (toFloat(total/(r.b)))*100 AS percent
  order by percent desc

我的输出是 Cannot split 'Long' by 'string' 我不明白错误

我受到这个问题和答案的启发,这是stackoverflow的内联链接。

neo4j
  • 2 2 个回答
  • 37 Views

2 个回答

  • Voted
  1. nimrod serok
    2023-08-17T22:43:40+08:002023-08-17T22:43:40+08:00

    据我了解,您可能想要这样的东西:

    MATCH (b:BOC_beroep)-[r:MAPS_TO]->(s:Soft_Skill)
    WITH SUM(1) AS total, r.type AS type, COLLECT(r.b) AS type_sum
    WITH REDUCE(total=0, number in type_sum | total + number) AS type_sum, type, total
    WITH COLLECT ({type: type, type_sum: toFloat(type_sum)}) AS data, SUM(total) AS total
    UNWIND data AS d
    WITH d.type_sum / total * 100 AS percent, d.type AS type
    RETURN percent, type
    ORDER BY percent DESC
    

    对于样本数据:

    MERGE (a1:BOC_beroep {occupation: 'dokter', code_occupation: 'sk_565'})  
    MERGE (a2:Soft_Skill {skill_code: 'sk_687', name: 'leren'}) 
    MERGE (a1)-[:MAPS_TO{type:"optioneel", b:0.5, k:1}]-(a2)
    MERGE (a1)-[:MAPS_TO{type:"optioneel", b:0.5, k:2}]-(a2)
    MERGE (a1)-[:MAPS_TO{type:"essentieel", b:1, k:3}]-(a2)
    MERGE (a1)-[:MAPS_TO{type:"essentieel", b:1, k:4}]-(a2)
    

    返回:

    ╒═════════╤════════════╕
    │"percent"│"type"      │
    ╞═════════╪════════════╡
    │50.0     │"essentieel"│
    ├─────────┼────────────┤
    │25.0     │"optioneel" │
    └─────────┴────────────┘
    
    • 1
  2. Best Answer
    cybersam
    2023-08-18T00:53:35+08:002023-08-18T00:53:35+08:00

    您的MAPS_TO关系显然将其b属性存储为字符串,因此任何查询都必须始终将其转换为浮点数才能对其进行数学运算。另外,您的查询中的数学是错误的 -r.b应该在分子中,并且total应该在分母中。

    此查询可能适合您:

    MATCH (b:BOC_beroep)-[r:MAPS_TO]->(s:Soft_Skill)
    WITH b.beroepstitel AS beorep, r.type AS type, s.name AS skill, SUM(TOFLOAT(r.b)) AS weight
    WITH SUM(weight) As total, COLLECT([beorep, type, skill, weight]) AS data
    UNWIND data AS datum
    RETURN
      datum[0] AS beroep,
      datum[1] AS type,
      datum[2] AS skill,
      datum[3]/total*100 AS percent
    ORDER BY percent desc
    

    第一个WITH子句将给定beorep、type、 和的所有权重相加skill。第二个WITH子句计算所有权重的总和并收集所需的所有其他数据。查询的其余部分很简单。

    这是一个示例结果:

    ╒════════╤════════════╤═══════╤═════════════════╕
    │beroep  │type        │skill  │percent          │
    ╞════════╪════════════╪═══════╪═════════════════╡
    │"dokter"│"essentieel"│"leren"│66.66666666666666│
    ├────────┼────────────┼───────┼─────────────────┤
    │"dokter"│"optioneel" │"leren"│33.33333333333333│
    └────────┴────────────┴───────┴─────────────────┘
    

    建议

    1. 如果将属性存储b为浮点数而不是字符串,则可以避免TOFLOAT始终进行转换的成本。您可以通过以下方式轻松转换所有存储的重量:

      MATCH ()-[r:MAPS_TO]->()
      SET r.b = TOFLOAT(r.b)
      
    2. 如果type只有 2 个可能的值,则需要更少的存储空间来将该属性存储为布尔值(名为isRequired)。这还可以简化使用该属性的查询。您可以通过以下方式轻松转换该属性:

      MATCH ()-[r:MAPS_TO]->()
      SET r.isRequired = CASE r.type WHEN 'essentieel' THEN true ELSE false END
      REMOVE r.type
      
    • 0

相关问题

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    使用 <font color="#xxx"> 突出显示 html 中的代码

    • 2 个回答
  • Marko Smith

    为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类?

    • 1 个回答
  • Marko Smith

    您可以使用花括号初始化列表作为(默认)模板参数吗?

    • 2 个回答
  • Marko Smith

    为什么列表推导式在内部创建一个函数?

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 个回答
  • Marko Smith

    为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)?

    • 4 个回答
  • Marko Smith

    为什么库中不调用全局变量的构造函数?

    • 1 个回答
  • Marko Smith

    std::common_reference_with 在元组上的行为不一致。哪个是对的?

    • 1 个回答
  • Marko Smith

    C++17 中 std::byte 只能按位运算?

    • 1 个回答
  • Martin Hope
    fbrereto 为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 您可以使用花括号初始化列表作为(默认)模板参数吗? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi 为什么列表推导式在内部创建一个函数? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A fmt 格式 %H:%M:%S 不带小数 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python C++20 的 std::views::filter 未正确过滤视图 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute 为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa 为什么库中不调用全局变量的构造函数? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis std::common_reference_with 在元组上的行为不一致。哪个是对的? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev 为什么编译器在这里错过矢量化? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan C++17 中 std::byte 只能按位运算? 2023-08-17 17:13:58 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve