Rdf “多SPARQL”;在此处插入“;单个请求中的查询

Rdf “多SPARQL”;在此处插入“;单个请求中的查询,rdf,sparql,Rdf,Sparql,我的问题与这篇文章中的问题类似 我希望在查询中有多个INSERT WHERE语句,但用于不同的主题。 我想测试一个特定的值(“testValueN”),如果存在,我想为该主题插入一个新的三元组 例如 PREFIX Sensor: <http://example.com/Equipment.owl#> { INSERT { ?subject1 Sensor:test2 'newValue1' . } WHERE {

我的问题与这篇文章中的问题类似

我希望在查询中有多个INSERT WHERE语句,但用于不同的主题。 我想测试一个特定的值(“testValueN”),如果存在,我想为该主题插入一个新的三元组

例如

PREFIX Sensor: <http://example.com/Equipment.owl#> 
{
    INSERT { 
        ?subject1 Sensor:test2 'newValue1' . 
           }
    WHERE {
        ?subject1 Sensor:test1  'testValue1' . 
          }
};
{
    INSERT { 
        ?subject2 Sensor:test2 'newValue2' . 
           }
    WHERE {
        ?subject2 Sensor:test1  'testValue2' . 
          }
};
前缀传感器:
{
插入{
?对象1传感器:测试2“新值1”。
}
在哪里{
?对象1传感器:测试1“测试值1”。
}
};
{
插入{
?对象2传感器:测试2“新值2”。
}
在哪里{
?对象2传感器:测试1“测试值2”。
}
};

我知道上面的疑问是错误的。我想知道在SPARQL中是否有类似的功能

是的,这是可能的。事实上,您的示例几乎完全正确,只需去掉每个插入的括号:

前缀传感器:
插入{
?对象1传感器:测试2“新值1”。
}
在哪里{
?对象1传感器:测试1“测试值1”。
};
插入{
?对象2传感器:测试2“新值2”。
}
在哪里{
?对象2传感器:测试1“测试值2”。
}
是有效的SPARQL更新序列

我希望在查询中有多个INSERT WHERE语句,但用于不同的主题。我想测试一个特定的值(“testValueN”),如果存在,我想为该主题插入一个新的三元组

您可以使用values来指定所需的oldValue/newValue对,并且只需要一次插入即可。它还可以更好地扩展到新的对,因为您只需向查询中添加一行

前缀传感器:
插入{
?对象传感器:测试2?新值
}
在哪里{
值(?旧值?新值){
('testValue1''newValue1')
('testValue2''newValue2')
}
?对象传感器:测试1?旧值
}

成功了!感谢Jeen,我使用上面的查询运行了100次批量更新,然后是1000次三倍更新。随着我不断增加三元组的数量,更新变得非常缓慢。对于100个INSERT WHERE updates需要4.2秒,1000个INSERT WHERE updates需要40.7秒,这是进行批量INSERT WHERE updates的正确且最有效的方法吗?我不这么认为,我猜在一次更新中进行,而不是在一个序列中对每个值进行更新,效率要高得多。但这是一个单独的问题,需要更详细地了解您的数据看起来像什么,以及您正试图实现什么:)我正在尝试在符合SPARQL 1.1的RDF存储中批量插入传感器读数。我得到一系列读数和相应的传感器ID。我需要查找传感器ID,获取该传感器的URI,如果存在,则插入传感器测量值。所以我需要先查找,然后插入。预抓取传感器URI可能不太好,因为更新将来自不同的机器,并且传感器的数量应该扩展到一百万或更多。请让我知道我是否在正确的轨道上。@JeenBroekstra在这种情况下,我认为只需使用一个values块就可以将多个查询组合成一个查询。我添加了显示该方法的内容。