热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

thoughtworks_Neo4j:绘制ThoughtWorks技术雷达图

thoughtworks为了获得圣诞节假期的乐趣,我认为在ThoughtWorksTechnologyRadar上创建不同点的图形以及建议随时间的变化是很酷的。我编写

thoughtworks

为了获得圣诞节假期的乐趣,我认为在ThoughtWorks Technology Radar上创建不同点的图形以及建议随时间的变化是很酷的。

我编写了一个脚本来提取每个blip(例如.NET Core )以及在每个雷达中出现的建议。我最终得到了一个CSV文件 :

|----------------------------------------------+----------+-------------|
| technology | date | suggestion |
|----------------------------------------------+----------+-------------|
| AppHarbor | Mar 2012 | Trial |
| Accumulate-only data | Nov 2015 | Assess |
| Accumulate-only data | May 2015 | Assess |
| Accumulate-only data | Jan 2015 | Assess |
| Buying solutions you can only afford one of | Mar 2012 | Hold |
|----------------------------------------------+----------+-------------|

然后,我编写了Cypher脚本来创建以下图形模型:

WITH ["Hold", "Assess", "Trial", "Adopt"] AS positions
UNWIND RANGE (0, size(positions) - 2) AS index
WITH positions[index] AS pos1, positions[index + 1] AS pos2
MERGE (position1:Position {value: pos1})
MERGE (position2:Position {value: pos2})
MERGE (position1)-[:NEXT]->(position2);load csv with headers from "file:///blips.csv" AS row
MATCH (position:Position {value: row.suggestion })
MERGE (tech:Technology {name: row.technology })
MERGE (date:Date {value: row.date})
MERGE (recommendation:Recommendation {id: tech.name + "_" + date.value + "_" + position.value})
MERGE (recommendation)-[:ON_DATE]->(date)
MERGE (recommendation)-[:POSITION]->(position)
MERGE (recommendation)-[:TECHNOLOGY]->(tech);match (date:Date)
SET date.timestamp = apoc.date.parse(date.value, "ms", "MMM yyyy");MATCH (date:Date)
WITH date
ORDER BY date.timestamp
WITH COLLECT(date) AS dates
UNWIND range(0, size(dates)-2) AS index
WITH dates[index] as month1, dates[index+1] AS month2
MERGE (month1)-[:NEXT]->(month2);MATCH (tech)<-[:TECHNOLOGY]-(reco:Recommendation)-[:ON_DATE]->(date)
WITH tech, reco, date
ORDER BY tech.name, date.timestamp
WITH tech, COLLECT(reco) AS recos
UNWIND range(0, size(recos)-2) AS index
WITH recos[index] AS reco1, recos[index&#43;1] AS reco2
MERGE (reco1)-[:NEXT]->(reco2);

请注意&#xff0c;我安装了APOC过程库&#xff0c;以便可以使用apoc.date.parse函数将日期的字符串表示形式转换为时间戳。 blips.csv文件需要进入Neo4j的导入目录。

现在&#xff0c;我们正在阅读以编写一些查询。

对于特定技术&#xff0c;技术雷达有4个职位&#xff1a;保留&#xff0c;评估&#xff0c;试用和采用&#xff1a;

  • 保留&#xff1a;谨慎处理
  • 评估&#xff1a;值得探索&#xff0c;目的是了解它将如何影响您的企业。
  • 试用&#xff1a;值得追求。 了解如何建立此功能非常重要。 企业应该在可以处理风险的项目上尝试使用该技术。
  • 采用&#xff1a;我们强烈认为行业应采用这些项目。 我们在项目中适当时使用它们。

我很好奇是否曾经有过一种技术&#xff0c;其建议最初是“保留”&#xff0c;后来又变成了“评估”。 我写了以下查询来找出&#xff1a;

MATCH (pos1:Position {value:"Hold"})<-[:POSITION]-(reco)-[:TECHNOLOGY]->(tech),(pos2:Position {value:"Assess"})<-[:POSITION]-(otherReco)-[:TECHNOLOGY]->(tech),(reco)-[:ON_DATE]->(recoDate),(otherReco)-[:ON_DATE]->(otherRecoDate)
WHERE (reco)-[:NEXT]->(otherReco)
RETURN tech.name AS technology, otherRecoDate.value AS dateOfChange;╒════════════╤══════════════╕
│"technology"│"dateOfChange"│
╞════════════╪══════════════╡
│"Azure" │"Aug 2010" │
└────────────┴──────────────┘

只有天蓝色 &#xff01; 该页面没有任何有关2010年4月最初的“保留”建议的解释&#xff0c;该建议大概是在“云”成为主流之前。 那反过来呢&#xff1f; 是否有最初建议“评估”但后来建议“保留”的技术&#xff1f;

MATCH (pos1:Position {value:"Assess"})<-[:POSITION]-(reco)-[:TECHNOLOGY]->(tech),(pos2:Position {value:"Hold"})<-[:POSITION]-(otherReco)-[:TECHNOLOGY]->(tech),(reco)-[:ON_DATE]->(recoDate),(otherReco)-[:ON_DATE]->(otherRecoDate)
WHERE (reco)-[:NEXT]->(otherReco)
RETURN tech.name AS technology, otherRecoDate.value AS dateOfChange;╒═══════════════════════════════════╤══════════════╕
│"technology" │"dateOfChange"│
╞═══════════════════════════════════╪══════════════╡
│"RIA" │"Apr 2010" │
├───────────────────────────────────┼──────────────┤
│"Backbone.js" │"Oct 2012" │
├───────────────────────────────────┼──────────────┤
│"Pace-layered Application Strategy"│"Nov 2015" │
├───────────────────────────────────┼──────────────┤
│"SPDY" │"May 2015" │
├───────────────────────────────────┼──────────────┤
│"AngularJS" │"Nov 2016" │
└───────────────────────────────────┴──────────────┘

其中有一些是Javascript库/框架&#xff0c;因此现在建议使用React代替。 让我们检查&#xff1a;

MATCH (t:Technology)<-[:TECHNOLOGY]-(reco)-[:ON_DATE]->(date), (reco)-[:POSITION]->(pos)
WHERE t.name contains "React.js"
RETURN pos.value, date.value
ORDER BY date.timestamp╒═══════════╤════════════╕
│"pos.value"│"date.value"│
╞═══════════╪════════════╡
│"Assess" │"Jan 2015" │
├───────────┼────────────┤
│"Trial" │"May 2015" │
├───────────┼────────────┤
│"Trial" │"Nov 2015" │
├───────────┼────────────┤
│"Adopt" │"Apr 2016" │
├───────────┼────────────┤
│"Adopt" │"Nov 2016" │
└───────────┴────────────┘

灰烬也很受欢迎&#xff1a;

MATCH (t:Technology)<-[:TECHNOLOGY]-(reco)-[:ON_DATE]->(date), (reco)-[:POSITION]->(pos)
WHERE t.name contains "Ember"
RETURN pos.value, date.value
ORDER BY date.timestamp╒═══════════╤════════════╕
│"pos.value"│"date.value"│
╞═══════════╪════════════╡
│"Assess" │"May 2015" │
├───────────┼────────────┤
│"Assess" │"Nov 2015" │
├───────────┼────────────┤
│"Trial" │"Apr 2016" │
├───────────┼────────────┤
│"Adopt" │"Nov 2016" │
└───────────┴────────────┘

让我们进行不同的切线研究&#xff0c;看看最近的雷达中引入了多少种技术&#xff1f;

MATCH (date:Date {value: "Nov 2016"})<-[:ON_DATE]-(reco)
WHERE NOT (reco)<-[:NEXT]-()
RETURN COUNT(*) ╒══════════╕
│"COUNT(*)"│
╞══════════╡
│"45" │
└──────────┘

哇&#xff0c;有45件事&#xff01; 它们如何分散在不同的职位上&#xff1f;

MATCH (date:Date {value: "Nov 2016"})<-[:ON_DATE]-(reco)-[:TECHNOLOGY]->(tech), (reco)-[:POSITION]->(position)
WHERE NOT (reco)<-[:NEXT]-()
WITH position, COUNT(*) AS count, COLLECT(tech.name) AS technologies
ORDER BY LENGTH((position)-[:NEXT*]->()) DESC
RETURN position.value, count, technologies╒════════════════╤═══════╤══════════════════════════════════════════════╕
│"position.value"│"count"│"technologies" │
╞════════════════╪═══════╪══════════════════════════════════════════════╡
│"Hold" │"1" │["Anemic REST"] │
├────────────────┼───────┼──────────────────────────────────────────────┤
│"Assess" │"28" │["Nuance Mix","Micro frontends","Three.js","Sc│
│ │ │ikit-learn","WebRTC","ReSwift","Vue.js","Elect│
│ │ │ron","Container security scanning","wit.ai","D│
│ │ │ifferential privacy","Rapidoid","OpenVR","AWS │
│ │ │Application Load Balancer","Tarantool","IndiaS│
│ │ │tack","Ethereum","axios","Bottled Water","Cass│
│ │ │andra carefully","ECMAScript 2017","FBSnapshot│
│ │ │Testcase","Client-directed query","JuMP","Cloj│
│ │ │ure.spec","HoloLens","Android-x86","Physical W│
│ │ │eb"] │
├────────────────┼───────┼──────────────────────────────────────────────┤
│"Trial" │"13" │["tmate","Lightweight Architecture Decision Re│
│ │ │cords","APIs as a product","JSONassert","Unity│
│ │ │ beyond gaming","Galen","Enzyme","Quick and Ni│
│ │ │mble","Talisman","fastlane","Auth0","Pa11y","P│
│ │ │hoenix"] │
├────────────────┼───────┼──────────────────────────────────────────────┤
│"Adopt" │"3" │["Grafana","Babel","Pipelines as code"] │
└────────────────┴───────┴──────────────────────────────────────────────┘

假期中有很多新事物可供探索&#xff01; 如果您想使用它们&#xff0c;则本文中使用的CSV文件&#xff0c;导入脚本和查询都可以在github上找到 。

翻译自: https://www.javacodegeeks.com/2016/12/neo4j-graphing-thoughtworks-technology-radar.html

thoughtworks



推荐阅读
  • 本问题探讨了在特定条件下排列儿童队伍的方法数量。题目要求计算满足条件的队伍排列总数,并使用递推算法和大数处理技术来解决这一问题。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 采用IKE方式建立IPsec安全隧道
    一、【组网和实验环境】按如上的接口ip先作配置,再作ipsec的相关配置,配置文本见文章最后本文实验采用的交换机是H3C模拟器,下载地址如 ... [详细]
  • 本文详细介绍了如何在Kendo UI for jQuery的数据管理组件中,将行标题字段呈现为锚点(即可点击链接),帮助开发人员更高效地实现这一功能。通过具体的代码示例和解释,即使是新手也能轻松掌握。 ... [详细]
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 在使用 DataGridView 时,如果在当前单元格中输入内容但光标未移开,点击保存按钮后,输入的内容可能无法保存。只有当光标离开单元格后,才能成功保存数据。本文将探讨如何通过调用 DataGridView 的内置方法解决此问题。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • 深入解析Nginx中的Location指令及其属性
    本文将详细探讨Nginx配置文件中关键的location指令,包括其三种匹配方式(精准匹配、普通匹配和正则匹配),以及如何在实际应用中灵活运用这些匹配规则。此外,还将介绍location下的重要子元素如root、alias和proxy_pass,并解释相关参数的使用方法。 ... [详细]
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
  • 本文详细介绍了Ionic框架的使用方法及其与Angular的集成。Ionic框架是一个强大的前端开发工具,适用于构建跨平台的移动应用程序。文章将探讨如何引入必要的CSS和JavaScript文件,并解释bundle.js中包含的核心功能,如路由等。 ... [详细]
  • 本文详细探讨了HTML表单中GET和POST请求的区别,包括它们的工作原理、数据传输方式、安全性及适用场景。同时,通过实例展示了如何在Servlet中处理这两种请求。 ... [详细]
  • Python处理Word文档的高效技巧
    本文详细介绍了如何使用Python处理Word文档,涵盖从基础操作到高级功能的各种技巧。我们将探讨如何生成文档、定义样式、提取表格数据以及处理超链接和图片等内容。 ... [详细]
  • 利用R语言进行股票价格数据的线性回归分析
    本文介绍了如何使用R语言对Excel中的股票价格数据集执行线性回归分析。通过具体的代码示例,展示了数据的导入、处理及模型构建的过程。 ... [详细]
author-avatar
默念我覀想你A_193
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有