0

dotNetRDF を使用して Rdf ノードを変更し、それを新しいファイルに保存しようとしていますが、同じファイルを取得しています !!

Identification/12 を Identification/18 に変更したいと思います。

テンプレート ファイル:

@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
@prefix owl:  <http://www.w3.org/2002/07/owl#>.
@prefix xsd:  <http://www.w3.org/2001/XMLSchema#>.
@prefix qudt: <http://qudt.org/schema/qudt#>.
@prefix qudt-unit: <http://qudt.org/vocab/unit#>.
@prefix knr: <http://kurl.org/NET/knr#>.

@prefix keak: <http://kurl.org/NET/keak#>.
@prefix keak-time: <http://kurl.org/NET/keak/time#>.
@prefix keak-eval: <http://kurl.org/NET/keak/eval#>.
@prefix keak-quantity: <http://kurl.org/NET/keak/quantity#>.
@prefix keak-ev: <http://kurl.org/NET/keak/ev#>.

@base <http://data.info/keak/knr/>.

<Identification/12> a keak-ev:Identification.

<Quantity/45> a qudt:Quantity ;
  qudt:quantityType keak-quantity:ElectricConsumption .

VB.NET コード:

Dim gKnr As IGraph = New Graph()
Dim ttlParser As TurtleParser = New TurtleParser()

'Load the file template
ttlParser.Load(gKnr, PATH_TEMPLATE)
gKnr.BaseUri = New Uri(keak_BASE_URI_Knr)

Dim oNode As INode = gKnr.CreateUriNode(New Uri("http://kurl.org/NET/keak/ev#Identification"))

'retrieve the item
Dim listRes As List(Of Triple) = gKnr.GetTriplesWithObject(oNode)
'?s = http://data.info/keak/Knr/Identification/12 , 
'?p = http://www.w3.org/1999/02/22-rdf-syntax-ns#type , 
'?o = http://kurl.org/NET/keak/ev#Identification

'modify the item
Dim tIdentification As Triple
If listRes.Count = 1 Then
    tIdentification = listRes(0)
    tIdentification.Subject.GraphUri = New Uri("http://data.info/kseak/knr/Identification/18")

End If

gKnr.Assert(tIdentification)

' Serialisation and Save
Dim ttlWriter As New CompressingTurtleWriter()
ttlWriter.DefaultNamespaces = gKnr.NamespaceMap
ttlWriter.Save(gKnr, PATH_NEW_FILE)
4

2 に答える 2

1

これは機能しません。ノードがどのグラフから来たかを示すGraphUriプロパティでありINode、ノードの実際の URI とは何の関係もありません。

とにかくINode不変であり、しようとしているようにノードの URI を変更することはできません。

RDF グラフで URI を変更したい場合は、Retract()その URI を使用するすべてのトリプルを作成し、新しい URI とAssert()それらを使用して新しいトリプルを作成する必要があります。

次の例は、おそらく構文的に正しくない VB ですが、一般的なアイデアが得られることを願っています。

Dim listRes As List(Of Triple) = gKnr.GetTriplesWithObject(oNode).ToList()

For Each origTriple in listRes
  gKnr.Retract(origTriple)
  Dim newTriple as Triple
  newTriple = new Triple(New Uri("http://data.info/kseak/knr/Identification/18"), origTriple.Predicate, origTriple.Object)
  gKnr.Assert(newTriple)
Next

もちろん、変更したい URI がサブジェクトの位置以外にもある場合は、ロジックを適切に変更する必要があります。

于 2015-10-22T09:47:40.503 に答える
0

robV に感謝します。とても助かりました。ビジュアルから例外が発生しましたが、なんとか修正できました。これが最終的なコードです。

    For Each origTriple In listRes
        gKnr.Retract(origTriple)
        Dim sNode As INode = gKnr.CreateUriNode(UriFactory.Create("http://data.info/keask/Knr/Identification/18"))
        Dim newTriple As Triple
        newTriple = New Triple(sNode, origTriple.Predicate, origTriple.Object)
        gKnr.Assert(newTriple)
    Next
于 2015-10-22T12:38:55.607 に答える