解析rdf格式的数据

自定义类ParseGoldRDF extends 类DefaultHandler,使用DefaultHandler类中的startDocument()、endDocument()、startElement()、endElement()、characters(),解析完成后直接导入到MongoDB数据库中。

package process;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/*
* @date 2015-11-08
*/
public class ParseGoldRDF extends DefaultHandler {

	private OperateDB 			db = null;

	private List<Record> 		rcdLst = null;
	private Record 				rcd = null;
	private String 				nodeName = null;
	private String 				value = null;
	private String 				content = null;
	private boolean 			flag = false;
	Map<String, Object> 		mapKeyValue = new HashMap<String, Object>();

	public ParseGoldRDF(OperateDB db) {
		this.db = db;
	}

	// 开始解析文档
	public void startDocument() throws SAXException {
		super.startDocument(); // 调用父类的函数
		rcdLst = new ArrayList<Record>();
	}

	// 结束文档解析
	public void endDocument() throws SAXException {
		super.endDocument();
	}

	// 开始解析节点
	// qName: 当前节点的名字
	// attributes: 当前节点的属性
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		super.startElement(uri, localName, qName, attributes);
		nodeName = qName; // 记录当前节点的名字

		if (qName.equals("Cell")) {
			flag = true;
			rcd = new Record();
		}

		if (flag)
			value = attributes.getValue(0);
	}

	// ch: 存储元素的内容
	// start: 内容的开始位置
	// length: 内容的长度
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		super.characters(ch, start, length);
		if (!flag)
			return;
		content = new String(ch, start, length);
	}

	// 结束节点解析
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		super.endElement(uri, localName, qName);

		// 结束一个cell的解析
		if (qName.equals("Cell")) {
			String name = (String) mapKeyValue.get("entity1"); 
			if (java.lang.Character.isUpperCase(name.charAt(0)))   //首字母大写,class
				mapKeyValue.put("type", "class"); 
			else                                                   //否则是prop
				mapKeyValue.put("type", "prop");
			
			rcd.setAttrKeyValue(mapKeyValue);
			rcdLst.add(rcd);
			mapKeyValue.clear();
			flag = false;
			return;
		}

		switch (nodeName) {
		case "entity1":
		case "entity2":
			String[] ele = value.split("#");
			value = ele[1];
			mapKeyValue.put(nodeName, value);
			break;
		case "relation":
			mapKeyValue.put(nodeName, content);
			break;
		default:
			break;
		}
	}
	
	//解析GD.rdf,返回map
	public void parseGD(String fileName, 
			Map<String, String> alignClass, Map<String, String> alignProp) throws Exception{

		alignClass.clear();
		alignProp.clear();
		SAXParserFactory factory = SAXParserFactory.newInstance();
		try {
			// 创建解析器
			SAXParser parser = factory.newSAXParser();
			parser.parse(fileName, this);

		} catch (ParserConfigurationException e) {
			System.out.println("ParserConfig error");
		} catch (SAXException e) {
			System.out.println("SAXException: xml not well formed");
		} catch (IOException e) {
			System.out.println("IO error");
		} finally{
			for(Record rcd:rcdLst){
				Map<String, Object> map = rcd.getAttrKeyValue();
				String type = map.get("type").toString();
				String entity1 = map.get("entity1").toString();
				String entity2 = map.get("entity2").toString();
				
				if(type.equals("class"))
					alignClass.put(entity1, entity2);
				else
					alignProp.put(entity1, entity2);
			}
		}
	}

	//解析GD.rdf,写入数据库
	public void parseDocument(String fileName) {
		// 实例化SAXParserFactory对象
		SAXParserFactory factory = SAXParserFactory.newInstance();
		try {
			// 创建解析器
			SAXParser parser = factory.newSAXParser();
			parser.parse(fileName, this);

		} catch (ParserConfigurationException e) {
			System.out.println("ParserConfig error");
		} catch (SAXException e) {
			System.out.println("SAXException: xml not well formed");
		} catch (IOException e) {
			System.out.println("IO error");
		} finally{
			// 写入数据库
			db.WriteDB(rcdLst, false);
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		String rootPath = "E:\\01-My Papers\\08Alignment of Graphical Linked Data in Semantic Web\\data\\OAEI2010\\benchmarks\\";
		String objName="304";
		String nameColl = "C"+objName+"GD";
		OperateDB db = new OperateDB("OAEI2010", nameColl);
		String fileGD    = rootPath + objName+"\\refalign.rdf";
		
		ParseGoldRDF handler = new ParseGoldRDF(db);
		handler.parseDocument(fileGD);
		System.out.println("finish parsing "+objName+"GD.rdf");
	}

}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,我理解了你的请求。首先,需要安装并启动一个SPARQL查询服务,可以使用Apache Jena Fuseki。以下是启动命令: ``` fuseki-server --update --mem /ds ``` 这将启动一个内存数据库并支持SPARQL查询,并在8000端口上提供服务。 接下来,我将提供三个示例查询语句,你可以在命令行或代码中使用sparqlwrapper库进行查询。这些查询将在默认图中执行,因此请确保你已经将电影rdf turtle数据加载到Fuseki服务中。 查询1:获取所有电影的名称和评分 ``` PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX movie: <http://example.org/movies#> SELECT ?name ?rating WHERE { ?movie rdf:type movie:Movie . ?movie movie:name ?name . ?movie movie:rating ?rating . } ``` 查询2:获取所有导演和他们执导的电影数量 ``` PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX movie: <http://example.org/movies#> SELECT ?director (COUNT(?movie) AS ?count) WHERE { ?movie rdf:type movie:Movie . ?movie movie:director ?director . } GROUP BY ?director ``` 查询3:获取所有电影的主演和他们的生日 ``` PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX movie: <http://example.org/movies#> SELECT ?actor ?birthday WHERE { ?movie rdf:type movie:Movie . ?movie movie:cast ?cast . ?cast movie:actor ?actor . ?actor movie:birthday ?birthday . } ``` 最后,使用sparqlwrapper库执行查询并解析结果,以下是示例代码: ```python from SPARQLWrapper import SPARQLWrapper, HTML sparql = SPARQLWrapper('http://localhost:8000/ds/query') sparql.setQuery('YOUR SPARQL QUERY HERE') sparql.setReturnFormat(HTML) results = sparql.query().convert() # 处理查询结果并以HTML形式展示 # 例如,使用beautifulsoup库解析HTML并创建表格来展示结果 ``` 希望这能帮助你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值