假设我们有一个巨大的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,我想查看它们的属性(类型属性)并仅检索那些在其type属性中具有子字符串的节点。
这在SPARQL中是否可行?基本上,站在节点上并查看此节点所连接的所有其他节点,然后仅检索与其属性上的另一个条件匹配的节点。
否则,我应该只检索节点n连接到的所有节点以及每个节点,运行另一个SPARQL查询来执行此检查吗?
我正在使用JENA存储数据。
答案 0 :(得分:5)
是的,这是可能的,但写这样的查询几乎总是非常不明智。
您使用的任何FILTER
都需要SPARQL引擎来查看每个可能的解决方案并评估其中的表达式,而许多表达式快速而便宜地评估像REGEX
这样的表达式非常昂贵。
基本上,您要求SPARQL引擎获得一些大的无限大的可能结果,然后对每个可能的解决方案应用正则表达式。如果您对Java regex performance有所了解,那么无论在SPARQL中使用它,您都会知道这通常是一个非常糟糕的主意。
许多SPARQL引擎支持full text extensions,它允许您以允许SPARQL引擎更有效地处理它们的方式表达这些类型的查询。对于Apache Jena,请参阅LARQ