比如说,推理后出现这种情况:
<rdf:Description rdf:about="test:eg#fb1">
<val2 rdf:resource="test:eg#B"/>
<val1 rdf:resource="test:eg#A"/>
<rdf:type rdf:resource="test:eg#followBy"/>
<val1 rdf:resource="test:eg#C"/>
<rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Thing"/>
<rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Resource"/>
<owl:sameAs rdf:resource="test:eg#fb1"/>
</rdf:Description>
本身只想读取一个val1,结果出现两个,这是因为 C owl:sameAs A 因此读取后将C作为一个属性添加进fb1了,先从头说起吧。
首先推理的进入点应该是:
<rdf:Description rdf:about="test:eg#p1">
<hasVal rdf:resource="test:eg#every1"/>
<rdf:type rdf:resource="test:eg#Pattern"/>
<rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Thing"/>
<rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Resource"/>
<owl:sameAs rdf:resource="test:eg#p1"/>
</rdf:Description>
从这个入口,应该可以找到p1,再从p1开始去寻找every1,话说回来,owl推理后每一个元素都有owl:sameAs自身,很烦啊,因为并不需要这个玩意,今后要想办法把这个东西去掉。找到的every1是:
<rdf:Description rdf:about="test:eg#every1">
<hasVal rdf:resource="test:eg#fb1"/>
<rdf:type rdf:resource="test:eg#Every"/>
<rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Thing"/>
<rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Resource"/>
<owl:sameAs rdf:resource="test:eg#every1"/>
</rdf:Description>
可见every1中hasVal属性含有fb1这一实例,因此去到fb1:
<rdf:Description rdf:about="test:eg#fb1">
<val2 rdf:resource="test:eg#B"/>
<val1 rdf:resource="test:eg#A"/>
<rdf:type rdf:resource="test:eg#followBy"/>
<val1 rdf:resource="test:eg#C"/>
<rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Thing"/>
<rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Resource"/>
<owl:sameAs rdf:resource="test:eg#fb1"/>
</rdf:Description>
这里便遇到双重val1了,因此应该设一个判断,当遇到双重val值的时候应该立马分开pattern为两个,或者说分开sparql的返回值也行。
再往下观察A、B和C三个实例:
<rdf:Description rdf:about="test:eg#A">
<owl:equivalentClass rdf:resource="test:eg#A"/>
<owl:sameAs rdf:resource="test:eg#A"/>
<rdfs:subClassOf rdf:resource="http://www.w3.org/2000/01/rdf-schema#Resource"/>
<owl:sameAs rdf:resource="test:eg#C"/>
<rdf:type rdf:resource="test:eg#Event"/>
<rdfs:subClassOf rdf:resource="test:eg#A"/>
<rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Class"/>
<rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Resource"/>
<rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Thing"/>
<owl:equivalentClass rdf:resource="test:eg#C"/>
<rdfs:subClassOf rdf:resource="test:eg#C"/>
<rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Class"/>
</rdf:Description>
<rdf:Description rdf:about="test:eg#B">
<rdfs:subClassOf rdf:resource="http://www.w3.org/2000/01/rdf-schema#Resource"/>
<rdf:type rdf:resource="test:eg#Event"/>
<rdfs:subClassOf rdf:resource="test:eg#B"/>
<rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Class"/>
<rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Resource"/>
<rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Thing"/>
<rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Class"/>
<owl:sameAs rdf:resource="test:eg#B"/>
<owl:equivalentClass rdf:resource="test:eg#B"/>
</rdf:Description>
<rdf:Description rdf:about="test:eg#C">
<owl:sameAs rdf:resource="test:eg#C"/>
<owl:sameAs rdf:resource="test:eg#A"/>
<rdf:type rdf:resource="test:eg#Event"/>
<owl:equivalentClass rdf:resource="test:eg#A"/>
<owl:equivalentClass rdf:resource="test:eg#C"/>
<rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Thing"/>
<rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Class"/>
<rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Resource"/>
<rdf:type rdf:resource="http://www.w3.org/2000/01/rdf-schema#Class"/>
<rdfs:subClassOf rdf:resource="test:eg#A"/>
<rdfs:subClassOf rdf:resource="http://www.w3.org/2000/01/rdf-schema#Resource"/>
<rdfs:subClassOf rdf:resource="test:eg#C"/>
</rdf:Description>
这里因为A、B和C都是Event类型了,因此可以从这里开始对pattern进行封装了,但是现在还有个问题,就是这三个实例其实是总实例,下面还有5个子实例,A1A2A3B1B2
这5个,但是由于这5个子实例是subClassOf A或是B的,这就导致关系信息时封装在子实例中的,但对于项目来说在这一层最好能够直接接触到子实例便可以直接进行分解的封装工作,这个问题下一步解决。