热门标签 | 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



推荐阅读
  • 使用圣杯布局模式实现网站首页的内容布局
    本文介绍了使用圣杯布局模式实现网站首页的内容布局的方法,包括HTML部分代码和实例。同时还提供了公司新闻、最新产品、关于我们、联系我们等页面的布局示例。商品展示区包括了车里子和农家生态土鸡蛋等产品的价格信息。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • 颜色迁移(reinhard VS welsh)
    不要谈什么天分,运气,你需要的是一个截稿日,以及一个不交稿就能打爆你狗头的人,然后你就会被自己的才华吓到。------ ... [详细]
  • Question该提问来源于开源项目:react-native-device-info/react-native-device-info ... [详细]
  • 概述H.323是由ITU制定的通信控制协议,用于在分组交换网中提供多媒体业务。呼叫控制是其中的重要组成部分,它可用来建立点到点的媒体会话和多点间媒体会议 ... [详细]
  • Hello.js 是一个用于连接OAuth2服务的JavascriptRESTFULAPI库,如Go ... [详细]
  • 移动传感器扫描覆盖摘要:关于传感器网络中的地址覆盖问题,已经做过很多尝试。他们通常归为两类,全覆盖和栅栏覆盖,统称为静态覆盖 ... [详细]
  • html结构 ... [详细]
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社区 版权所有