假设我们有一个巨大的 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 来存储数据。
最佳答案
是的,这是可能的,但是编写这样的查询几乎总是非常不明智的。
您使用的任何 FILTER
都需要一个 SPARQL 引擎来查看每个可能的解决方案并评估其中的表达式,而许多表达式的评估既快速又便宜,而 REGEX
之类的某些表达式非常昂贵。
本质上,您是在要求 SPARQL 引擎获得一些可能的结果的无限大范围,然后对每个可能的解决方案应用正则表达式。如果您对 Java regex performance 有所了解,那么您就会知道这通常是一个非常糟糕的主意,无论它在 SPARQL 中的用途如何。
许多 SPARQL 引擎都支持 full text extensions,它允许您以一种让 SPARQL 引擎更有效地处理它们的方式来表达这些类型的查询。对于 Apache Jena,请参阅 LARQ
关于rdf - 可以执行这些类型的 SPARQL 查询吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14620245/