我正在研究一个数据转换管道,该管道将从Oracle SQL关系数据库读取数据,将其写入RDF三元存储,然后将其拉入JVM内存。原始数据库包含一些单元格,这些单元格的字符串值以Unicode字符开头,有时表示为<0x1a>
或U+001A
。这可能是错误地在数据库中,但是我无法控制该数据库,因此必须按原样进行处理。我也不能修改字符串,因为它们后来被用作从数据库中其他表中查找信息的主键(是的,我知道这并不理想)。我正在Windows上工作。
包含此字符的单元格映射到三元组中的文字值。尝试从三元存储中提取并遍历数据时,由于存在非法字符,我收到以下错误:
error:org.eclipse.rdf4j.query.QueryEvaluationException:
org.eclipse.rdf4j.query.QueryEvaluationException:
org.eclipse.rdf4j.query.resultio.QueryResultParseException:
org.xml.sax.SAXParseException; lineNumber: 1085; columnNumber: 14; An
invalid XML character (Unicode: 0x1a) was found in the element content of
the document.
如果有意思的话,下面是我用来从三元组迭代结果的代码:
val cxn = getDatabaseConnection()
val query = getTriplestoreQuery()
val tupleQueryResult = cxn.prepareTupleQuery(QueryLanguage.SPARQL, query).evaluate()
// fails at this line when illegal XML character is discovered
while (tupleQueryResult.hasNext())
{
// do some stuff with the data
}
我有点挣扎,因为我必须找到一种方法来将这些数据拉入内存,而无需修改字符串(因为它们当前存在于数据库中)。我还没有找到针对这种情况的转义解决方案。我的最后一招是捕获QueryEvaluationException,并且根本不处理损坏的字符串,但是最好能够挽救这些数据。