3

假设我们有一个巨大的 RDF 图并且想要执行以下操作:(我尝试了它但它不起作用 - 想知道我是否错误地构造了查询或 rdf 转储的一些问题)。

select ?n ?o 
where {
    ?n <name_of_a_node> <name_of_this_node>.
    ?n ?p ?o.
    ?o <type_of_a_node> ?t.
    FILTER(REGEX(STR(?t), "president")).
}

上面的查询说我知道节点 n 的名称。所以,我得到了节点 n 的 URI。然后,我正在获取节点 n 的所有谓词,并且其他节点连接签证这个谓词。对于连接到节点 a 的每个节点 o,我想查看它们的属性(类型属性)并仅检索那些在其类型属性中具有子字符串的节点 o。

这在 SPARQL 中可行吗?基本上,站在一个节点上并查看该节点连接到的所有其他节点,然后仅检索那些与其属性匹配另一个条件的节点。

否则,我是否应该只检索节点 n 连接到的所有节点,并为每个节点运行另一个 SPARQL 查询来执行此检查?

我正在使用 JENA 来存储数据。

4

1 回答 1

5

是的,这是可能的,但编写这样的查询几乎总是非常不明智的。

您使用的任何FILTER方法都需要 SPARQL 引擎来查看每个可能的解决方案并评估其中的表达式,而许多表达式的评估速度很快且成本低廉,有些REGEX则非常昂贵。

本质上,您是在要求 SPARQL 引擎获取大量无限可能的结果,然后对每个可能的解决方案应用正则表达式。如果您对Java 正则表达式性能有所了解,那么您就会知道这通常是一个非常糟糕的主意,无论它在 SPARQL 中的使用如何。

许多 SPARQL 引擎支持全文扩展,允许您以一种让 SPARQL 引擎更有效地处理它们的方式表达这些类型的查询。对于 Apache Jena,请参阅LARQ

于 2013-01-31T11:01:31.473 回答