rdf - 在SPARQL模式中选择多个值作为对象

标签 rdf sparql semantic-web

在SPARQL中,我们可以做这样的事情

select * where {
    ?s   (_:prop1 | _:prop2)  "some_val" .
    ...
    #use ?s in other patterns
    ?s    ?o    ?p .
}


是否可以对模式的对象部分执行相同操作?在不可能的情况下,有哪些解决方法呢?

例如:

select * where {
    ?s   _:prop ("v1" | "v2") .
    ...
    #use ?s in other patterns
    ?s    ?o    ?p .
}

最佳答案

有几种方法可以做到这一点。最简单的纯SPARQL 1.0方法是使用UNION例如

SELECT * WHERE
{
  { ?s _:prop "v1" } UNION { ?s _:prop "v2" }

  # Use ?s in other patterns
}

这可能是最简单的方法,但是如果您需要?s上的多个约束,则可能很快就会变得笨拙。
第二种方法是在IN子句中使用FILTER函数,这需要SPARQL 1.1实现,例如
SELECT * WHERE
{
  ?s _:prop ?value .
  FILTER(?value IN ("v1", "v2"))

  # Use ?s in other patterns
}

这里的问题是,如果您有很多备选方案或IN可能匹配的许多数据,则使用?s _:prop ?value的性能可能会非常差
除了-许多优化程序实际上会将第二种方法扩展到幕后的第一种方法。
第三种方法是使用VALUES子句,它再次需要SPARQL 1.1实现:
SELECT * WHERE
{
  VALUES (?value) { ( "v1" ) ( "v2 " ) }
  ?s _:prop ?value .

  # Use ?s in other patterns
}

这可能是最好的选择,因为它可以更好地扩展到许多替代方案(取决于您的SPARQL实现),并且可能是最好的读写方式。

关于rdf - 在SPARQL模式中选择多个值作为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17599658/

相关文章:

symfony - 应该将 URI 重定向到子域吗?

java - process Builder java无法运行java中的某些python代码。怎么解决?

graph - 分析 RDF 图 : average number of certain relation

sparql - DBpedia SPARQL 过滤器不适用于所有结果

rdf - 在 Web 应用程序中实现语义搜索

json - 将大型RDF/XML文件转换或转换为JSON-LD格式-如何?

.net - 在使用 GPL 的 SemWeb 的同时,ROWLEX 如何获得 L-GPL 许可?

python - 查询大的海龟文件

rdf - RDF、RDFS、OWL的关系

semantic-web - 耶拿fuseki猫头鹰本体