是否存在一个很好的示例,说明如何使用SPARQL在三元组集合中用另一个子字符串替换一个子字符串?

时间:2019-06-19 10:30:23

标签: sparql

我想使用SPARQL查询编辑一组URI,用“ iso-639”替换子字符串“ iso-693”。我正在使用teacherRoom,但似乎什么也没做。

我有一个很大的SKOS分类法,带有不正确字符串的URI。他们应该使用以下字符串:“ iso-639”,但是在创建它时我输入了“ iso-693”时出错。我想纠正它。我使用了下面显示的SPARQL查询,该查询在运行时返回一条消息“更新成功”,但是三元组数据实际上都没有改变。我要去哪里错了?

REPLACE

我希望子字符串的所有出现都更改为所需的值,但是尽管显示了成功消息,但似乎丝毫没有改变。

2 个答案:

答案 0 :(得分:0)

您缺少删除旧值的位(INSERT仅添加了一个新的三元组)。要替换三元组,您应该DELETE同时INSERT DELETE { ?s ?p ?o } INSERT { ?s ?p ?o2 } WHERE { ?s ?p ?o . FILTER (regex(str(?s), "iso-693") || regex(str(?o), "iso-693")) BIND(REPLACE(?o, "iso-693", "iso-639", "i") AS ?o2) . } 使用新的三元组,如下所示:

string dateFrom = DropDownList1.Text.ToString();
            string dateTo = DropDownList2.Text.ToString();

            string myconstring = ConfigurationManager.ConnectionStrings["KanbanConnectionString"].ConnectionString;
            using (SqlConnection conn = new SqlConnection(myconstring))
            {
                DataTable dat = new DataTable();
                using (SqlCommand cmd = new SqlCommand("SELECT * FROM city.xls WHERE Date BETWEEN @dateFrom AND  @dateTo"))
                {
                    cmd.Parameters.AddWithValue("@dateFrom", dateFrom);
                    cmd.Parameters.AddWithValue("@dateTo", dateTo);
                    conn.Open();
                    SqlDataAdapter da = new SqlDataAdapter();
                    da.SelectCommand = cmd;
                    da.Fill(dat);
                    D2.DataSource = dat;
                    D2.DataBind();
                }
            }

答案 1 :(得分:0)

如果您要定位URI,则需要构造具有所需替换的新IRI,并将其与更新的INSERT?s一起用于更新的?o部分DELETE部分。 REPLACE会产生与主题不符的文字。

建议使用以下内容:

DELETE {
    ?s ?p ?o
}
INSERT {
    ?newS ?p ?newO
} WHERE { 
    ?s ?p ?o .
    bind("iso-693" as ?match) .
    bind("iso-639" as ?replacement) .
    bind (regex(str(?s), ?match) as ?subjMatch) .
    bind (regex(str(?o), ?match) as ?objMatch) .
    filter (?subjMatch || ?objMatch)
    bind (if(?subjMatch, IRI(replace(str(?s), ?match, ?replacement)), ?s) as ?newS)
    bind (if(?objMatch, IRI(replace(str(?o), ?match, ?replacement)), ?o) as ?newO)
}