知识图谱生成与路径推荐已经做好了,但是基于文本文件来输入输出总归不像那么回事,所以把这个系统的输入连到数据库上了,当然配置没那么麻烦,还是保留在文件里。另外调整了输出到数据库的输出格式,来适应主系统的需要。
新增了两个类 用于数据库的输入输出,其中主要的麻烦在于,数据库里存的访问记录是一种时间序列,并不是之前文本文档里那种很容易就用换行分开的,这让我找每个人的事务有一点麻烦。这里用的Date类,以一周为一个事务单位。从数据库中查询时按照用户降序,时间升序来排列,用一个当前时间标记位来记录当前事务周的开始,当新的记录的时间比当前周开始晚超过七天时,开始新的一周,把之前的划分到上一个事务,之后的划分到下一个事务。
package DataProcess;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Vector;
import com.mysql.fabric.xmlrpc.base.Data;
//import Model.Knowledge;
public class ReadData{
private String url = "jdbc:mysql://localhost:3306/resource_aggregation_platform?useUnicode=true&characterEncoding=utf-8;";
private String driver = "com.mysql.jdbc.Driver";
private String userName = "root";
private String password = "";
//将持久化的数据对应到内存中
public Vector<String> getAllCourse(String table_name){
// ArrayList<Knowledge> re = new ArrayList<Knowledge>();
Vector<String> courses = new Vector<String>();
Connection con = getConnection();
String sql = "SELECT * FROM "+table_name;
Statement stmt;
try {
stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){
String course_name = rs.getString("course_name");
courses.add(course_name);
}
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return courses;
}
//将持久化的数据对应到内存中
public Vector<Vector<Vector<String>>> getVisitData(){
// ArrayList<Knowledge> re = new ArrayList<Knowledge>();
Vector<Vector<Vector<String>>> data = new Vector<Vector<Vector<String>>>();
Connection con = getConnection();
String sql = "SELECT * FROM `course_visits` WHERE 1 ORDER BY `user_id`,`transaction`";
Statement stmt;
try {
stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(sql);
int cur_user = -1;
int cur_day = -1;
Date cur_date = new Date(2010, 1, 1);
long aweak = new Date(1970,1,8).getTime();
Vector<Vector<String>> user = new Vector<>();
Vector<String> itemSet = new Vector<>();
while(rs.next()){
int user_id = rs.getInt("user_id");
String course_name = rs.getString("course_name");
// int day = rs.getInt("transaction");
Date date = rs.getDate("transaction");
if (user_id > cur_user) {
user = new Vector<>();
data.add(user);
cur_user++;
cur_day = -1;
}
// if (day > cur_day) {
// itemSet = new Vector<>();
// user.add(itemSet);
// cur_day++;
// }
if (date.getTime() - aweak > cur_date.getTime()) {
itemSet = new Vector<>();
user.add(itemSet);
cur_date = new Date(cur_date.getTime() + aweak);
}
itemSet.add(course_name);
}
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return data;
}
//获取连接
private Connection getConnection(){
Connection conn = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, userName, password);
if(!conn.isClosed()) {
System.out.println("数据库连接成功!");
}
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
}
这样就可以用数据库中的数据跑一个知识图谱试试看了
emmm,的确不如之前的demo数据效果那么好,不过调调参应该也不错。另外可以看到有一个比较好的路径推荐了,可能因为现在数据库里的初始数据考虑到了有人用的多有人用得少。
还有一部分是写入数据库,东西虽然不少,但是不太难,所以就不放上来看了,关于数据格式的问题也不放上来了。
另外的部分是测试工作,果不其然在网站里发现了各种诡异的排版问题,还有报错什么的,好在都是小问题,和对应负责的同学一说就改过来了。