我有两张图表,数据相似,但差别很小。
我的目标是使用SPARQL合并它们并执行集成。我想要两个RDF图的最终输出,这些图使用SPARQL在单个RDF图中略有不同。
示例一个图表是:
ns0:BaseRoleClassLib
a ns0:ExternalReference ;
ns0:externalReferenceAlias "BaseRoleClassLib" .
ns0:maxTransportationWeight
a ns0:Attribute ;
schema:name "maxTransportationWeight" ;
ns0:hasValue "35" .
第二张图是:
ns0:BaseRoleClassLib
a ns0:ExternalReference ;
ns0:maxTransportationWeight
a ns0:Attribute ;
schema:name "maxTransportationWeight" ;
ns0:hasValue "35.0" .
唯一的区别是一个传输值在整数中,而另一个在浮点数中。
所以我写了一个查询来概括它们:
select distinct ?integer
from <graph1>
from <graph2>
where {
?s ns0:hasValue ?y
Bind(xsd:integer(xsd:decimal(?y)) as ?integer)
}
}
这将差异转换为整数的广义形式。 现在我的下一个目标是使用上面的结果将这些文件集成到一个RDF中。
我想要一个RDF文件,它具有这些的并集以及float到整数的解析泛化。
S1 , S2 -> generalization -> integration -> s3 RDF
如何使用SPARQL构造函数/ insert实现此目的?
非常感谢
答案 0 :(得分:1)
这可以通过CONSTRUCT
非常简单地完成。 SPARQL更新似乎不支持FROM
,因此您需要使用UNION
GRAPH
个语句。以下应该获得您正在寻找的合并 - 基本上过滤掉旧ns0:hasValue
值并插入新值:
CONSTRUCT {
?s ?p ?o .
?s ns0:hasValue ?intValue .
}
FROM <graph1>
FROM <graph2>
WHERE {
?s ?p ?o .
OPTIONAL{?s ns0:hasValue ?origValue .}
BIND(IF(datatype(?origValue) = xsd:integer, ?origValue, xsd:integer(STRBEFORE(str(?origValue), ".")) )as ?intValue)
FILTER (?p != ns0:hasValue)
}
请注意,将float转换为整数并不简单。你必须接受四舍五入或有逻辑来舍入十进制值。