一、gStore数据库探索

​ gStore是面向RDF知识图谱的开源图数据库系统,支持复杂的SPARQL查询及有效的增删改操作,支持海量三元组规模的RDF知识图谱的数据管理任务。而gStore云平台是为了方便用户使用搭建的云服务web平台,用户可以在该平台上进行数据库管理(包括数据集构建、删除、导出等操作),也可以实现数据库查询及结果可视化,满足了广大gStore用户的基本需求。

1.构建数据库

执行bin/gbuild jinrong ./homework/jinrong.nt构建图数据库

2. 查看数据库列表

执行bin/gshow

3. 数据库状态查询

执行bin/gmonitor jinrong:

二. 任务要求

作业目标:利用提供的金融数据集,搭建以gStore为管理平台的小型金融知识图谱;并实现任务一、任务二、任务三的功能,返回正确的结果。(建议将gstore作为知识图谱存储介质,自己搭建应用平台完成实验)

数据集:本数据集是一部分清洗好的股东持股关系三元组数据jinrong.nt文件,主语是公司的名称,宾语是股东的名称,在使用时需要先上传到gStore云端。数据集放在百度网盘中,里面有数据内容的简单介绍。

任务一:按照任务一将数据上传到gStore云平台或者直接使用将数据集中的jinrong.nt文件上传到gStore云平台。利用构建好的知识图谱,编写sparql语句查询两个公司之间的关联路径(2-hop)。例如输入公司“招商局轮船股份有限公司”和“招商银行股份有限公司”,得到这两家公司之间的所有路径。

​ **任务二:**编写sparql语言实现多层股权的穿透式查询,可以根据指定层数获得对应层级的股东,例如:输入“招商局轮船股份有限公司””和层数3,就会把“招商局轮船股份有限公司”所对应公司所有三层以内的公司找出来。

​ **任务三:**编写sparql语言实现环形持股查询,判断两家公司是否存在环形持股现象,环形持股是指两家公司彼此持有对方的股份。例如:输入“A”和“C”,判断两家公司是否存在环形持股。

三、源码说明

​ 附件源码简单说明:

  • hw.java:程序启动类,运行main方法启动
  • Client.java:为程序界面类,负责界面及信息显示
  • TaskStrategy.java:抽象策略接口,定义了三个方法RunTask、GetSQL、ShowResult
  • Task1.java、Task2.java、Task3.java:具体策略类,对应任务一、任务二、任务三

四、查询结果

1. 任务一

  1. 举例:如果输入“招商局轮船股份有限公司”和“深圳市晏清投资发展有限公司”,则相应的sparql语句如下:

    PREFIX : <file:///F:/d2r-server-0.7/holder8.nt#holder_copy/>
    SELECT ?x ?p
    WHERE
    {{:招商局轮船股份有限公司 ?x :深圳市晏清投资发展有限公司.}union{:深圳市晏清投资发展有限公司 ?x :招商局轮船股份有限公司.}union{?p ?b :深圳市晏清投资发展有限公司.:招商局轮船股份有限公司 ?c ?p.}union{?p ?b :招商局轮船股份有限公司.:深圳市晏清投资发展有限公司 ?c ?p.}}
    
  2. 运行hw.java中的main方法,输入:招商局轮船股份有限公司 深圳市晏清投资发展有限公司

  3. 输入:招商局轮船股份有限公司 招商银行股份有限公司

  4. 输入:A 招商银行股份有限公司

2. 任务二(未解决)

  1. 举例:如果输入:公司名称 层数,则对应的sparql语句如下:

    PREFIX : <file:///F:/d2r-server-0.7/holder8.nt#holder_copy/>
    SELECT
    (kHopReachablePath(?x, :公司名称, true, 层数, {}) AS ?y)
    WHERE {}
    
  2. 运行hw.java中的main方法,输入 :招商局轮船股份有限公司 3

查询结果为:
{"head": {"link": [],"vars": ["y"]},"results": {"bindings": [{"y": {"type": "literal","value": "{\"paths\":[{\"src\":\"\",\"dst\":\"\",\"edges\":[],\"nodes\":[]}]}"}}]},"StatusCode": 0,"StatusMsg": "success","AnsNum": 1,"OutputLimit": -1,"ThreadId": "140116571899648","QueryTime": "��"
}

sql代码思路:使用SELECT (kHopReachablePath(?x, :公司名称, true, 层数, {}) AS ?y) WHERE { } K 跳可达性查询,返回层数k以内可以到达公司节点的所有节点。

现存问题:通过ghttp发送sparql请求并解析json数据,并没有获取到对应的路径节点信息,多次调试也没有将问题解决
目前想法:控制好变量,用java写了个递归,将所有情况(1~k层内)的sparql语句用union拼起来,再ghttp执行sparql得到返回结果?

3. 任务三

  1. 举例:输入:A C 则对应的sparql语句为:

    PREFIX : <file:///F:/d2r-server-0.7/holder8.nt#holder_copy/>
    select (cycleBoolean(:A, :C, true, {}) as ?x)where{ }
    
  2. 运行hw.java中的main方法,输入: A C

  3. 输入:A 深圳市晏清投资发展有限公司

五、附java源码:

public class hw {public static void main(String[] args) {new Client().start();}
}public class Client {//连接对象GstoreConnector gc;Scanner scanner = new Scanner(System.in);//策略对象TaskStrategy taskStrategy = null;public Client(){String IP = "127.0.0.1";int Port = 9000;String username = "root";String password = "123456";// start a gc with given IP, Port, username and passwordgc = new GstoreConnector(IP, Port, username, password);//buildgc.build("jinrong", "./homework/jinrong.nt");//loadgc.load("jinrong");//加载完成// System.out.println("加载数据库完成");}public void start(){String input = null;while(true){System.out.println("=================================");System.out.println("一、菜单:");System.out.println("=================================");System.out.println("1. 测试任务一:获取两个节点之间两跳以内的所有可达路径");System.out.println("2. 测试任务二:节点层数穿透式查询");System.out.println("3. 测试任务三:判断两个节点之间是否存在环路");System.out.println("=================================");System.out.print("请输入任务对应数字:");String num=scanner.nextLine();switch(num){case "1":System.out.println("请输入两个公司的名称[name1(String) name2(String)]:");input = scanner.nextLine();String[] EnterName = input.split(" ");taskStrategy = new Task1();System.out.println("=================================");System.out.println("查询结果为:");taskStrategy.RunTask(EnterName[0],EnterName[1], gc);System.out.println("=================================");//System.out.println(EnterName[0]+" "+EnterName[1]);break;case "2":System.out.println("请输入公司名称和要查询的层数[name(String) layers(int)]:");input = scanner.nextLine();String EnterpriseName = input.split(" ")[0];String Layer = input.split(" ")[1];System.out.println(EnterpriseName+" "+ Layer);taskStrategy = new Task2();System.out.println("=================================");System.out.println("查询结果为:");taskStrategy.RunTask(EnterpriseName,Layer, gc);System.out.println("=================================");break;case "3":System.out.println("请输入要测试环路的两个公司的名称[name1(String) name2(String)]:");input = scanner.nextLine();String[] EnterName_huang = input.split(" ");taskStrategy = new Task3();System.out.println("=================================");System.out.println("查询结果为:");taskStrategy.RunTask(EnterName_huang[0],EnterName_huang[1], gc);System.out.println("=================================");break;default:System.out.println("没有该选项,请输入正确数字选项!!");break;}System.out.println("按回车键继续....");String temp = scanner.nextLine();}}
}public interface TaskStrategy {void RunTask(String arg1,String arg2,GstoreConnector gc);String GetSQL(String arg1,String arg2,int val);void ShowResult(String arg1,String arg2,String result,int val);
}public class Task1 implements TaskStrategy{boolean isempty = true;@Overridepublic void RunTask(String arg1, String arg2, GstoreConnector gc) {String res=null;// TODO Auto-generated method stub//oneString sparql1 = GetSQL(arg1, arg2, 1);//test// System.out.println("sql语句为:"+sparql1);// queryres = gc.query("jinrong", "json", sparql1);//showShowResult(arg1, arg2, res, 1);//twoString sparql2 = GetSQL(arg1, arg2, 2);//test// System.out.println("sql语句为:"+sparql2);// queryres = gc.query("jinrong", "json", sparql2);//showShowResult(arg1, arg2, res, 2);//threeString sparql3 = GetSQL(arg1, arg2, 3);//test// System.out.println("sql语句为:"+sparql3);// queryres = gc.query("jinrong", "json", sparql3);//showShowResult(arg1, arg2, res, 3);//fourString sparql4 = GetSQL(arg1, arg2, 4);//test// System.out.println("sql语句为:"+sparql4);// queryres = gc.query("jinrong", "json", sparql4);//showShowResult(arg1, arg2, res, 4);//last note:if(isempty) System.out.println("两个公司之间两跳内不存在可达路径!!");}@Overridepublic String GetSQL(String arg1, String arg2,int val) {String sparql = "PREFIX : <file:///F:/d2r-server-0.7/holder8.nt#holder_copy/>\nSELECT DISTINCT";if(val==1){sparql += " ?x " + "where"+ "{"+ " :"+arg1+ " ?x" + " :"+arg2+ ". "+ "}";}else if(val ==2){sparql += " ?x " + "where"+ "{"+ " :"+arg2+ " ?x" + " :"+arg1+ ". "+ "}";}else if(val == 3){sparql += " ?x " + "where"+ "{"+ " ?x ?b" +" :"+ arg2 + ". \n"+ " :"+arg1+" ?c ?x."+ "}";}else if(val == 4){sparql += " ?x " + "where"+ "{"+ " ?x ?b" +" :"+ arg1 + ". \n"+ " :"+arg2+" ?c ?x."+ "}";}return sparql;}@Overridepublic void ShowResult(String arg1,String arg2,String result,int val) {//1.将json字符串转化为json对象JSONObject json = JSONObject.parseObject(result);int AnsNum = json.getIntValue("AnsNum");String Result_x = null;if(AnsNum>=1){//第二层JSONObject bindingsjson = json.getJSONObject("results");//第三层JSONArray bindingsarrys = bindingsjson.getJSONArray("bindings");//链式编程直接得到结果Result_x = ((JSONObject)bindingsarrys.get(0)).getJSONObject("x").getString("value");}// TODO Auto-generated method stubif(val==1){if(AnsNum>=1&&Result_x.equals("http://localhost:2020/vocab/resource/holder_copy_holder_name")){System.out.println("一跳:" + arg1+ " --> " + arg2);isempty = false;}}else if(val ==2){if(AnsNum>=1&&Result_x.equals("http://localhost:2020/vocab/resource/holder_copy_holder_name")){System.out.println("一跳:" + arg2 + " --> " + arg1);isempty = false;}}else if(val == 3){if(AnsNum>=1&&Result_x.contains("file:///F:/d2r-server-0.7/holder8.nt#holder_copy/")){// file:///F:/d2r-server-0.7/holder8.nt#holder_copy/String ShowAnsString = Result_x.substring(Result_x.lastIndexOf("/")+1);System.out.println("两跳:" + arg1+ " --> " + ShowAnsString +" --> "+ arg2);isempty = false;}}else if(val == 4){if(AnsNum>=1&&Result_x.contains("file:///F:/d2r-server-0.7/holder8.nt#holder_copy/")){// file:///F:/d2r-server-0.7/holder8.nt#holder_copy/String ShowAnsString = Result_x.substring(Result_x.lastIndexOf("/")+1);System.out.println("两跳:" + arg2+ " --> " + ShowAnsString +" --> "+ arg1);isempty = false;}}}
}public class Task2 implements TaskStrategy {@Overridepublic void RunTask(String arg1, String arg2, GstoreConnector gc) {// TODO Auto-generated method stub//一层一层计算// for(int i=1;i<=Integer.parseInt(arg2);i++){// }String res;String sparql = GetSQL(arg1, arg2, 0);res = gc.query("jinrong", "json", sparql);// testSystem.out.println("sql语句为:"+sparql);ShowResult(arg1, arg2, res, 0);}@Overridepublic String GetSQL(String arg1, String arg2, int val) {// TODO Auto-generated method stubString sparql = "PREFIX : <file:///F:/d2r-server-0.7/holder8.nt#holder_copy/>\nSELECT DISTINCT ";sparql += "(kHopReachablePath(?x, :"+ arg1+", true, "+arg2+", {}) AS ?y)" + " where{ }";return sparql;}@Overridepublic void ShowResult(String arg1, String arg2, String result, int val) {// TODO Auto-generated method stubSystem.out.println("查询结果为:");System.out.println(result);}}public class Task3 implements TaskStrategy{@Overridepublic void RunTask(String arg1, String arg2, GstoreConnector gc) {// TODO Auto-generated method stubString res;String sparql = GetSQL(arg1, arg2, 0);res = gc.query("jinrong", "json", sparql);// test// System.out.println("sql语句为:"+sparql);ShowResult(arg1, arg2, res, 0);}@Overridepublic String GetSQL(String arg1, String arg2, int val) {// TODO Auto-generated method stubString sparql = "PREFIX : <file:///F:/d2r-server-0.7/holder8.nt#holder_copy/>\nSELECT ";sparql += "(cycleBoolean(:" + arg1 + ",:"+ arg2 + ",true,{}) as ?x) " + "where{ }";return sparql;}@Overridepublic void ShowResult(String arg1, String arg2, String result, int val) {// TODO Auto-generated method stub//1.将json字符串转化为json对象JSONObject json = JSONObject.parseObject(result);int AnsNum = json.getIntValue("AnsNum");String Result_x = null;if(AnsNum>=1){//第二层JSONObject bindingsjson = json.getJSONObject("results");//第三层JSONArray bindingsarrys = bindingsjson.getJSONArray("bindings");//链式编程直接得到结果Result_x = ((JSONObject)bindingsarrys.get(0)).getJSONObject("x").getString("value");}if(Result_x.equals("true")){System.out.println("公司:"+arg1+" 和 公司:"+arg2+ " 存在环形持股。。。");}else{System.out.println("公司:"+arg1+" 和 公司:"+arg2+ " 不存在环形持股。。。");}}}

国科大图数据管理与分析课程项目gStore实验报告相关推荐

  1. 系统设计与分析课程项目个人小结

    文章目录 系统设计与分析课程项目个人小结 简短的课程学习自我总结 管理 分析 设计 开发 PSP2.1 表格 最得意/或有价值/或有苦劳的工作清单 最得意 最有价值 最有劳苦 个人GIT总结 Dash ...

  2. 国科大学习资料--多媒体分析与理解(卢汉请)-2019期末考试题

    国科大学习资料–多媒体分析与理解(卢汉请)-2019期末考试题 国科大学习资料–多媒体分析与理解(卢汉请)-2019期末考试题 国科大学习资料–多媒体分析与理解(卢汉请)-2019期末考试题 ==== ...

  3. 讲座录播|图数据管理与分析在线名家讲座

    2020年11月15日"图数据管理与分析名家讲座"在北京大学英杰交流中心如期举行,多位专家学者以图数据的高效管理与计算为主题,探讨了图算法.图计算系统的设计和理论分析方法. 分别由 ...

  4. 中国氯吡脲市场运营分析及项目投资策略建议报告2022-2028年版

    中国氯吡脲市场运营分析及项目投资策略建议报告2022-2028年版 ※※※鸿※※※晟※※※信※※※合※※※研※※※究※※※院※※※※   *章氯吡脲行业运营分析 *节氯吡脲行业定义及分类 第二节行业研 ...

  5. 网页编程课程大作业实验报告HTML5 、CSS5 、JavaScript

    网页编程课程大作业实验报告 课程名称 网页编程 实验成绩 计算机学院制 一.实验内容与要求 利用HTML5 .CSS5 .JavaScript等知识,按照特定的主题制作一个完整的网站. 二.网站名称以 ...

  6. 计算机组成原理课程设计总结,计算机组成原理课程设计的实验报告

    计算机组成原理课程设计的实验报告 长治学院课程设计报告课程名称: 计算机组成原理课程设计 设计题目: 设计一台性能简单的计算机 系 别: 计算机系 专 业: 计科1101班 组 别: 第三组 学生姓名 ...

  7. 华为数据管理与分析课程

    数据管理与分析通识课为HCIA-openGauss华为认证openGauss数据库工程师在线课程前置课程. 信息表示与数据组织通识课为HCIA-Big Data 华为认证大数据工程师在线课程前置课程 ...

  8. 第三周课程总结&实验报告一

    实验报告: 1.打印输出所有的"水仙花数",所谓"水仙花数"是指一个3位数,其中各位数字立方和等于该数本身.例如,153是一个"水仙花数". ...

  9. 成绩分析系统c语言实验报告,学生成绩管理系统实验报告

    <学生成绩管理系统实验报告>由会员分享,可在线阅读,更多相关<学生成绩管理系统实验报告(13页珍藏版)>请在人人文库网上搜索. 1.学生成绩管理系统实验报告实验名称:学生成绩管 ...

最新文章

  1. 我已经喜欢上了Python
  2. 在AcGIS随着大数据的生成DEM
  3. 福玛特机器人评测_深度爆料扫地机器人地宝福玛特D820评测好不好?怎么样呢?内幕曝光测评...
  4. springboot集成restTemplate实现rest接口调用
  5. opencv 眼睛识别 linux,用opencv测试人脸识别眨眼练习及问题
  6. 线程队列,线程池和协程
  7. DOS特殊字符转义方法
  8. js ajax上传图片到服务器
  9. 干货:如何正确描述存储IO类型?
  10. dbms数据库管理系统_基本数据库管理系统(DBMS)能力问题和解答
  11. oracle 中此处列不允许,oracle-序列 ora-02287 此处不允许序号
  12. Windows Live Messenger 2011,离线安装、多开、去广告……
  13. Elasticsearch 日期时间处理
  14. 勤能补拙 VS 思考补拙
  15. Windows64Adobe2019/2019全家桶
  16. Tapestry 5 组件模板
  17. 可解释性研究 -LRP-for-LSTM
  18. 项目里用到的Jquery,json,struts2结合
  19. 操作系统—物理内存与虚拟内存
  20. JavaScript三目判读男女

热门文章

  1. 基于51单片机的电子密码指纹锁无线WiFi通信原理图PCB
  2. 服务器运行bat文件闪退,win10运行bat文件一闪而过怎么办_网站服务器运行维护
  3. go语言消息推送服务器,Golang 消息推送系统
  4. 在CMD里使用命令实现CMD全屏
  5. 面试——讲讲什么是happens-before?
  6. 基于MATLAB的模拟信号AM、FM等调制与解调
  7. 创业板、融资融券被寄予厚望
  8. uniapp H5接入使用环信聊天
  9. (转自)何新:谈“玄”(一)
  10. (转)Linux Kernel核心中文手册