我找不到这个问题的答案,所以我开了一个新问题。我有一个像这样的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
in这个例子)。
但是当我查询dc:Terminal.ConnectivityNode
时,它总会选择它们。
感谢您的时间。
答案 0 :(得分:2)
让我们首先使用三元组的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> .
如果这些是特定要求,那么您可以使用强力查询。这是<http://marklogic.icap.org/unnamed#_CN2>
值的一个:
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")
}