dotNetRdf 方法 UpdateGraph 在 Virtuoso 服务器上不成功
dotNetRdf Method UpdateGraph not successful with Virtuoso server
我在 linux 机器上有一个 Virtuoso-Server(我“继承”了它,所以我没有自己设置它)。我还继承了连接到服务器的 OntoWiki 前端来操作数据。由于这有点笨拙且非常手动,因此我编写了一个 C# 项目来访问和显示数据。我使用 dotNetRdf 访问数据。读取是没有问题的,但是现在我也想更新数据,于是使用了UpdateGraph方法。为了测试这个,我写了一个小的测试项目,在 dotNetRdf-Website 的这个例子之后:https://github.com/dotnetrdf/dotnetrdf/wiki/UserGuide-Triple-Store-Integration#updategraph
这是我的实现。
VirtuosoManager _virtuosoManager = new VirtuosoManager(ServerAddress, ServerPort, VirtuosoManager.DefaultDB, _user, _password);
string _graphName = "http://od.fmi.uni-leipzig.de/example";
Graph _graph = new Graph();
_virtuosoManager.LoadGraph(_graph, _graphName);
INode s = _graph.CreateUriNode(new Uri(_graphName + "/test"));
INode p = _graph.CreateUriNode(new Uri(RdfSpecsHelper.RdfType));
INode o = _graph.CreateUriNode(new Uri("http://example.org/Example"));
Triple t = new Triple(s, p, o);
_virtuosoManager.UpdateGraph(_graphName, new List<Triple>() { t }, null);
此代码运行时没有错误,但遗憾的是图中也没有任何更新(我使用以下 SPARQL-Request 检查)
SELECT * WHERE {GRAPH ?g {<http://od.fmi.uni-leipzig.de/example/test> ?p ?o .}}
returns 没什么。
所以,我更改了服务器上的日志级别,以查看 how/if 服务器收到我的请求。我在日志文件中发现了以下几行:
...
15:47:16 CSLQ_0 109 xxx.xxx.xxx.xxx 1113:2 s1113_2_1 SPARQL define output:format '_JAVA_' INSERT DATA
INTO <http://od.fmi.uni-leipzig.de/example>
{
<http://od.fmi.uni-leipzig.de/example/test> a <http://example.org/Example> .
}
15:47:16 COMP_2 109 xxx.xxx.xxx.xxx 1113:2 Compile text: SPARQL define output:format '_JAVA_' INSERT
DATA
INTO <http://od.fmi.uni-leipzig.de/example>
{
<http://od.fmi.uni-leipzig.de/example/test> a <http://example.org/Example> .
}
15:47:16 EXEC_1 109 xxx.xxx.xxx.xxx 1113:2 s1113_2_1 Exec 1 time(s) SPARQL define output:format
'_JAVA_' INSERT DATA
INTO <http://od.fmi.uni-leipzig.de/example>
{
<http://od.fmi.uni-leipzig.de/example/test> a <http://example.org/Example> .
}
看来我的请求已到达并已计算完毕。尽管如此,三重奏不见了。您知道要检查/更改请求或服务器的哪些内容以使其正常工作吗?
更新:
对于 dotNetRdf 的 VirtuosoManager,还有另一种称为“更新”的方法,您可以在其中向端点发送 SPARQL 查询。所以我用服务器日志中的 SPARQL 查询进行了尝试:
string query = "INSERT DATA " + Environment.NewLine +
"INTO <http://od.fmi.uni-leipzig.de/example>" + Environment.NewLine +
"{" + Environment.NewLine +
"<http://od.fmi.uni-leipzig.de/example/test> a <http://example.org/Example> ." + Environment.NewLine +
"}";
_virtuosoManager.Update(query);
并且三元组被插入数据库!所以这似乎是(我使用的)dotNetRdf 的 UpdateGraph() 方法的问题。所以,我有一种解决方法,但我更愿意省略容易出错的 Triple=>SPARQL 转换,并将其留给 dotNetRdf 的专业人员(他们可能在 UpdateGraph() 方法中执行此操作)。
这是请求的服务器日志:
13:45:58 CSLQ_0 109 xxx.xxx.xxx.xxx 1113:2 s1113_2_0 SPARQL INSERT DATA
INTO <http://od.fmi.uni-leipzig.de/example>
{
<http://od.fmi.uni-leipzig.de/example/test> a <http://example.org/Example> .
}
13:45:58 COMP_2 109 xxx.xxx.xxx.xxx 1113:2 Compile text: SPARQL INSERT DATA
INTO <http://od.fmi.uni-leipzig.de/example>
{
<http://od.fmi.uni-leipzig.de/example/test> a <http://example.org/Example> .
}
13:45:58 EXEC_1 109 xxx.xxx.xxx.xxx 1113:2 s1113_2_0 Exec 1 time(s) SPARQL INSERT DATA
INTO <http://od.fmi.uni-leipzig.de/example>
{
<http://od.fmi.uni-leipzig.de/example/test> a <http://example.org/Example> .
}
如您所见,区别在于
define output:format 'JAVA'
对于失败的调用。
提前致谢,
弗兰克
作为answered on the dotNetRDF issue —
The output:format
isn't the problem here I think. The issue is that the update transaction is not committed by the code as you have it. The way to do this is to call the Dispose()
method on _virtuosoManager
. So wrapping your update in a using()
block is the best way to go:
using(var _virtuosoManager = new VirtuosoManager(...)) {
// Call one or more update methods
}
Or alternatively you can explicitly call Dispose()
(for example if you are going to wrap the manager instance in another class).
并得到提问者的确认—
thank you very much for the reply, it indeed solved my problem! (I used .Dispose()
)
我在 linux 机器上有一个 Virtuoso-Server(我“继承”了它,所以我没有自己设置它)。我还继承了连接到服务器的 OntoWiki 前端来操作数据。由于这有点笨拙且非常手动,因此我编写了一个 C# 项目来访问和显示数据。我使用 dotNetRdf 访问数据。读取是没有问题的,但是现在我也想更新数据,于是使用了UpdateGraph方法。为了测试这个,我写了一个小的测试项目,在 dotNetRdf-Website 的这个例子之后:https://github.com/dotnetrdf/dotnetrdf/wiki/UserGuide-Triple-Store-Integration#updategraph
这是我的实现。
VirtuosoManager _virtuosoManager = new VirtuosoManager(ServerAddress, ServerPort, VirtuosoManager.DefaultDB, _user, _password);
string _graphName = "http://od.fmi.uni-leipzig.de/example";
Graph _graph = new Graph();
_virtuosoManager.LoadGraph(_graph, _graphName);
INode s = _graph.CreateUriNode(new Uri(_graphName + "/test"));
INode p = _graph.CreateUriNode(new Uri(RdfSpecsHelper.RdfType));
INode o = _graph.CreateUriNode(new Uri("http://example.org/Example"));
Triple t = new Triple(s, p, o);
_virtuosoManager.UpdateGraph(_graphName, new List<Triple>() { t }, null);
此代码运行时没有错误,但遗憾的是图中也没有任何更新(我使用以下 SPARQL-Request 检查)
SELECT * WHERE {GRAPH ?g {<http://od.fmi.uni-leipzig.de/example/test> ?p ?o .}}
returns 没什么。
所以,我更改了服务器上的日志级别,以查看 how/if 服务器收到我的请求。我在日志文件中发现了以下几行:
...
15:47:16 CSLQ_0 109 xxx.xxx.xxx.xxx 1113:2 s1113_2_1 SPARQL define output:format '_JAVA_' INSERT DATA
INTO <http://od.fmi.uni-leipzig.de/example>
{
<http://od.fmi.uni-leipzig.de/example/test> a <http://example.org/Example> .
}
15:47:16 COMP_2 109 xxx.xxx.xxx.xxx 1113:2 Compile text: SPARQL define output:format '_JAVA_' INSERT
DATA
INTO <http://od.fmi.uni-leipzig.de/example>
{
<http://od.fmi.uni-leipzig.de/example/test> a <http://example.org/Example> .
}
15:47:16 EXEC_1 109 xxx.xxx.xxx.xxx 1113:2 s1113_2_1 Exec 1 time(s) SPARQL define output:format
'_JAVA_' INSERT DATA
INTO <http://od.fmi.uni-leipzig.de/example>
{
<http://od.fmi.uni-leipzig.de/example/test> a <http://example.org/Example> .
}
看来我的请求已到达并已计算完毕。尽管如此,三重奏不见了。您知道要检查/更改请求或服务器的哪些内容以使其正常工作吗?
更新: 对于 dotNetRdf 的 VirtuosoManager,还有另一种称为“更新”的方法,您可以在其中向端点发送 SPARQL 查询。所以我用服务器日志中的 SPARQL 查询进行了尝试:
string query = "INSERT DATA " + Environment.NewLine +
"INTO <http://od.fmi.uni-leipzig.de/example>" + Environment.NewLine +
"{" + Environment.NewLine +
"<http://od.fmi.uni-leipzig.de/example/test> a <http://example.org/Example> ." + Environment.NewLine +
"}";
_virtuosoManager.Update(query);
并且三元组被插入数据库!所以这似乎是(我使用的)dotNetRdf 的 UpdateGraph() 方法的问题。所以,我有一种解决方法,但我更愿意省略容易出错的 Triple=>SPARQL 转换,并将其留给 dotNetRdf 的专业人员(他们可能在 UpdateGraph() 方法中执行此操作)。
这是请求的服务器日志:
13:45:58 CSLQ_0 109 xxx.xxx.xxx.xxx 1113:2 s1113_2_0 SPARQL INSERT DATA
INTO <http://od.fmi.uni-leipzig.de/example>
{
<http://od.fmi.uni-leipzig.de/example/test> a <http://example.org/Example> .
}
13:45:58 COMP_2 109 xxx.xxx.xxx.xxx 1113:2 Compile text: SPARQL INSERT DATA
INTO <http://od.fmi.uni-leipzig.de/example>
{
<http://od.fmi.uni-leipzig.de/example/test> a <http://example.org/Example> .
}
13:45:58 EXEC_1 109 xxx.xxx.xxx.xxx 1113:2 s1113_2_0 Exec 1 time(s) SPARQL INSERT DATA
INTO <http://od.fmi.uni-leipzig.de/example>
{
<http://od.fmi.uni-leipzig.de/example/test> a <http://example.org/Example> .
}
如您所见,区别在于
define output:format 'JAVA'
对于失败的调用。
提前致谢,
弗兰克
作为answered on the dotNetRDF issue —
The
output:format
isn't the problem here I think. The issue is that the update transaction is not committed by the code as you have it. The way to do this is to call theDispose()
method on_virtuosoManager
. So wrapping your update in ausing()
block is the best way to go:using(var _virtuosoManager = new VirtuosoManager(...)) { // Call one or more update methods }
Or alternatively you can explicitly call
Dispose()
(for example if you are going to wrap the manager instance in another class).
并得到提问者的确认—
thank you very much for the reply, it indeed solved my problem! (I used
.Dispose()
)