Sparql 查询构造新图

Sparql query to construct a new graph

我有两张数据相似但略有不同的图表。

我的目标是使用 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 文件,其中包含这些的联合以及已解决的浮点数到整数的泛化。

S1 , S2 -> generalization -> integration -> s3 RDF

如何使用 SPARQL 构造函数/插入实现此目的?

非常感谢

这可以通过 CONSTRUCT 非常简单地完成。 SPARQL 更新似乎不支持 FROM,因此您需要使用 UNION of 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)
}

请注意,将浮点数转换为整数并不简单。您必须忍受向下舍入或具有按小数值舍入的逻辑。