【问题标题】:SPARQL: remove duplicated attributesSPARQL:删除重复的属性
【发布时间】:2016-08-24 08:31:12
【问题描述】:

我找不到这个问题的答案,所以我要开一个新的。我有一个这样的 RDF 数据集:

<dc:Terminal rdf:ID="_1A5C">
<dc:Terminal.ConnectivityNode rdf:resource="#_CN1"></dc:Terminal.ConnectivityNode>
<dc:Terminal.ConnectivityNode rdf:resource="#_CN2"></dc:Terminal.ConnectivityNode>
<dc:Object.description>DESC</dc:Object.description>
<dc:Object.name>T1</dc:Object.name>
<dc:Equipment rdf:resource="#_E8455C1C0A63"></dc:Equipment>
</dc:Terminal>

...我需要区分属性dc:Terminal.ConnectivityNode。例如重命名为dc:Attribute1(本例中包含CN1)和dc:Attribute2(本例中包含CN2)。

当然,当我查询dc:Terminal.ConnectivityNode 时,它总是会同时选择它们。

感谢您的宝贵时间。

【问题讨论】:

标签: duplicates sparql


【解决方案1】:

让我们从使用三元组的 Turtle 文本序列化开始。这让我们更容易理解三元组:

:_1A5C
  rdf:type dc:Terminal ;
  dc:Equipment <http://marklogic.icap.org/unnamed#_E8455C1C0A63> ;
  <http://example.org/file1#Object.description> "DESC" ;
  <http://example.org/file1#Object.name> "T1" ;
  <http://example.org/file1#Terminal.ConnectivityNode> <http://marklogic.icap.org/unnamed#_CN1> ;
  <http://example.org/file1#Terminal.ConnectivityNode> <http://marklogic.icap.org/unnamed#_CN2> . 

如果这些是特定要求,那么您可以使用蛮力查询。这是&lt;http://marklogic.icap.org/unnamed#_CN2&gt; 值的一个:

PREFIX dc: <http://example.org/so#>
DELETE {
    :_1A5C ?p <http://marklogic.icap.org/unnamed#_CN2> .
}
INSERT {
   :_1A5C dc:Attribute2 <http://marklogic.icap.org/unnamed#_CN2> .
}
WHERE {
   :_1A5C ?p <http://marklogic.icap.org/unnamed#_CN2> .
}

或者您可以根据您提供的示例对此进行概括:

PREFIX dc: <http://example.org/so#>
DELETE {
   :_1A5C ?p ?o
}
INSERT {
   :_1A5C ?newProp ?o
}
WHERE {
   :_1A5C ?p ?o .
   BIND(xsd:string(?o) AS ?objStr)
   # get the end char to append to the new property, e.g. '_CN1' ==> 'Attribute1'
   BIND(SUBSTR(?objStr, (STRLEN(?objStr))) AS ?endChar)
   BIND(IRI(CONCAT("http://example.org/so#Attribute", ?endChar)) AS ?newProp)
   FILTER CONTAINS(xsd:string(?o), "_CN")
}

【讨论】:

  • 感谢您的回答。但属性值并不总是以 _CN1 或 _CN2 结尾,这只是一个示例。它是一些字母和数字的混合体,唯一常见的是属性名称和属性值长度。
  • 好的,只要名称有规律,SUBSTR 和其他 SPARQL 字符串函数应该能够完成工作。
  • 嗨,苏格兰人,您能进一步解释一下吗?使用 SUBSTR 不是问题,但我不能只选择两个属性之一,因为当我 查询 dc:Terminal.ConnectivityNode 时,它​​总是会同时选择两者。
  • ?objStr 绑定到查询的每个匹配项。因此,如果您有 x:_CN1 和 x:CN2,那么您将获得两个匹配项。根据INSERT 语句,将分别使用名为dc:Attribute1dc:Attribute2 的属性创建两个三元组,并将它们插入到您的图表中。
猜你喜欢
  • 2023-01-30
  • 2010-11-16
  • 2015-07-26
  • 2015-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-27
相关资源
最近更新 更多