Sparql查询构建新图

时间:2016-04-06 21:48:16

标签: sparql construct

我有两张图表,数据相似,但差别很小。

我的目标是使用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实现此目的?

非常感谢

1 个答案:

答案 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转换为整数并不简单。你必须接受四舍五入或有逻辑来舍入十进制值。