我正在玩弄RDF,特别是如何访问存储在rdf存储中的信息.与传统关系数据库的巨大差异在于缺少预定义的模式:在关系数据库中,您知道该表具有这些列,并且您可以在技术上将每行映射到类的实例.该类具有明确定义的方法和明确定义的属性.
在无模式系统中,您不知道哪些数据与给定信息相关联.这就像拥有一个具有任意而非预定义数量的列的数据库表,并且每行可以包含任意数量的这些列中的数据.
与ObjectRelational Mappers类似,有Object RDF映射器.RDFAlchemy和SuRF是我现在正在玩的两个.基本上,它们为您提供了一个Resource对象,其方法和属性是动态提供的.这有点意义......但是,它并不那么容易.在许多情况下,您更喜欢拥有一个定义良好的界面,并且可以更好地控制在模型对象上设置和获取数据时发生的事情.在某种意义上,拥有这样的通用访问会使事情变得困难.
我注意到的另一件事情(也是最重要的)是,即使在 一般的,无模式的数据预计将提供有关资源的任意信息,在实践中,你或多或少知道"类的信息"往往是在一起.当然,你不能排除附加信息的存在,但在某些情况下,这是例外,而不是常态,尽管这个例外对于严格的模式来说太明显了.在文章的rdf表示中(例如在RSS/ATOM提要中),您知道所描述资源的术语,并且可以将它们映射到定义良好的对象.如果提供其他信息,则可以定义扩展对象(从基础对象继承)以提供增强信息的访问者.因此,从某种意义上说,当您想要查看您感兴趣的特定附加信息时,可以通过"面向模式的对象"处理无模式数据.
我的问题与您对无架构数据存储的实际使用实践的体验有关.它们如何映射到面向对象的世界,以便您可以熟练地使用它而不必太接近无模式存储的"裸机"?(在RelDB术语中,不使用太多SQL并直接搞乱表结构)
访问注定是非常通用的(例如,SuRF"插入属性"是您可以访问数据的最高,最专业的级别),或者具有特定商定的方便模式的专用类也是一种很好的方法,然而引入有多种类来访问新的和意外的相关数据的风险?
小智 4
我想我的简短回答是“不”。我是一个有点白胡子的人,并且已经完成了大量将 XML 数据映射到关系数据库的工作。如果您确实决定使用这样的数据库,则必须不断验证您的数据。您还需要非常严格的纪律,以避免数据库缺乏通用性。使用模式在这里会有所帮助,因为大多数 XML 模式都是面向对象的,因此是可扩展的,从而简化了分析的需要,以避免创建具有不同名称的相似数据,这将导致任何必须访问您的数据库的人对您产生邪恶的想法。
根据我的个人经验,如果您正在做一些网络数据库有意义的事情,那就去做吧。如果没有,您将失去关系数据库可以执行的所有其他操作,例如完整性检查、事务和集选择。然而,由于大多数人无论如何都使用关系数据库作为对象存储,我想这一点是没有意义的。
至于如何访问该数据,只需将其放入哈希表中即可。严重地。如果任何地方都没有模式,那么您将永远不知道那里有什么。如果您有一个模式,则可以使用它来生成访问器对象,但您获得的很少,因为您失去了底层存储的所有灵活性,同时获得了 DAO(数据访问对象)的不灵活性。
例如,如果您有一个哈希表,那么从 XML 解析器中获取值通常相当容易。您定义要使用的存储类型,然后遍历 XML 树并将值放入存储类型中,根据需要将类型存储在哈希表或列表中。然而,如果您使用 DAO,您最终将无法简单地扩展数据对象(XML 的优势之一),并且您必须为对象创建 getter 和 setter
public void setter(Element e) throws NoSuchElementException {
try {
this.Name = e.getChild("Name").getValue();
} catch (Exception ex) {
throw new NoSuchElementException("Element not found for Name: "+ex.getMessage());
}
}
Run Code Online (Sandbox Code Playgroud)
当然,除非您必须对该模式层中的每个值执行此操作,包括加载器和子层的定义。当然,如果您使用采用回调的更快解析器,您最终会陷入更大的混乱,因为您现在必须在生成结果树时跟踪您所在的对象。
我已经完成了所有这些工作,尽管我通常构造一个验证器,然后构造一个提供 XML 和数据类之间匹配的适配器,然后构造一个协调过程以使其与数据库协调一致。不过,几乎所有代码最终都会生成。如果您拥有 DTD,则可以生成大部分 Java 代码来访问它,并且具有合理的性能。
最后,我只是将自由形式、网络或分层数据保留为自由形式、网络或分层数据。
| 归档时间: |
|
| 查看次数: |
2057 次 |
| 最近记录: |