繁体   English   中英

有没有办法将 SPARQL 查询作为实例存储在 RDF 文件中?

[英]Is there a way to store SPARQL queries as instances in an RDF file?

我正在创建一个对有向无环图 (DAG) 进行编码的数据库,其中节点是 RDF 实例,边是对象属性。 最终,我想创建与我的 DAG 集中的图形模式相匹配的 SPARQL 查询。 有很多(~200)个我感兴趣的子树模式,并希望以某种方式存储这些查询以供以后执行。

下面的 SPARQL 是一个选择具有一组节点和连接的 DAG 实例的玩具示例:

SELECT ?dag
WHERE {
?dag :has_node ?n1 ;
     :has_node ?n2 ;
     :has_node ?n3 .
?n1 rdfs:type :Type1 ;
    :parent_of ?n2 .
?n2 rdfs:type :Type2 ;
    :parent_of ?n3 .
?n3 rdfs:type :Type3 .

}

是否可以将上述 SPARQL 查询存储为 RDF 中的实例? 如果是这样,我可以在 SPARQL 查询中引用该实例并将其转换为 SPARQL 吗? (见下文)

SELECT ?dag
WHERE {
?dag :has_graph_pattern ?graphPattern .
}

?graphPattern变量将是一个实例,它将编码与第一个 SPARQL 查询相同的内容。

感谢您的任何反馈!

另一种方法是使用SHACL 高级功能词汇表。 您可以将?dag变量存储为形状图中的?this变量(请参阅有关基于 SPARQL 的目标部分)。 然后,您可以在sh:select谓词之后存储模式,并使用 select 查询作为查找dag模式。

将 SPARQL 查询编码为 OWL 当然是可能的,但我不确定是否有人这样做过(这将是一个复杂的过程)。 至于拉出来,肯定的。 它将作为SPARQL Query Result检索,您必须手动解析以获取完整的 sparql 查询。

简而言之,通过首先将查询转换为 RDF,可以在 OWL 文档中嵌入 sparql 查询。 您当然可以拉出查询,_但是重建原始查询的处理必须在另一个系统(Java、Python 等)中完成。 听起来像是一篇很酷的论文主题,但在序列化和检索查询方面有很多工作要做。 我推荐它吗? 如果您想立即做任何事情,则不会。

正如 Roos 所建议的,我能够在 SHACL 规则中对我的子图进行编码,并使用它们来创建与 DAG 和子图相关的三元组。

在下面的例子中,有两个 DAG,DAG1 和 DAG2,它们的节点可以有 3 个可能的节点标签:A、B 或 C。在这个例子中,我想找到带有 C<--B-->C 的 DAG模式,然后创建一个新的三元组链接该 DAG 与代表此子图的实例: ex:DAG ex:has_subgraph ex:subGraph1 我匹配的这个模式在下图中以黄色突出显示。

玩具数据集中的 DAG

子图模式可以编码为如下所示的 ttl 中的 SHACL 规则。 确保在规则之前有sh:declare语句,因为这可能会导致您使用的 SHACL 规则推理器出现问题。 这存储在一个名为dagShapes.ttl的文件中

@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix ex: <http://example.com/ns#> .

ex:
        sh:declare [
                sh:prefix "ex" ;
                sh:namespace "http://example.com/ns#"^^xsd:anyURI ;
        ] .

ex:DAGSubGraphRule1
        a sh:NodeShape ;
        sh:targetClass ex:DAG ;
        sh:rule [
                a sh:SPARQLRule ;
                sh:prefixes ex: ;
                sh:construct """ 
                        CONSTRUCT {
                                $this ex:has_subgraph ex:subGraph1 .
                        }
                        WHERE {
                                $this ex:has_node ?n1 ;
                                      ex:has_node ?n2 ;
                                      ex:has_node ?n3 .

                                ?n1 a ex:nodeType_B ;
                                        ex:parent_of ?n2 ;
                                        ex:parent_of ?n3 .
                                ?n2 a ex:nodeType_C .
                                ?n3 a ex:nodeType_C .

                        }
                        """ ;
        ] ;
.

本示例中的 DAG 编码在它们自己的名为dagData.ttl的文件中,如下所示:

@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix ex: <http://example.com/ns#> .

ex:DAG1
        a ex:DAG ;
        ex:has_node ex:d1_n1 ;
        ex:has_node ex:d1_n2 ;
        ex:has_node ex:d1_n3 ;
        ex:has_node ex:d1_n4 ;
        ex:has_node ex:d1_n5 .

ex:d1_n1 a ex:nodeType_A ;
        ex:parent_of ex:d1_n2 .
ex:d1_n2 a ex:nodeType_A ;
        ex:parent_of ex:d1_n3 .
ex:d1_n3 a ex:nodeType_B ;
        ex:parent_of ex:d1_n4 ;
        ex:parent_of ex:d1_n5 .
ex:d1_n4 a ex:nodeType_C .
ex:d1_n5 a ex:nodeType_C .

ex:DAG2
        a ex:DAG ;
        ex:has_node ex:d2_n1 ;
        ex:has_node ex:d2_n2 ;
        ex:has_node ex:d2_n2 ;
        ex:has_node ex:d2_n2 ;
        ex:has_node ex:d2_n2 .

ex:d1_n1 a ex:nodeType_A ;
        ex:parent_of ex:d1_n2 .
ex:d1_n2 a ex:nodeType_A ;
        ex:parent_of ex:d1_n3 .
ex:d1_n3 a ex:nodeType_B ;
        ex:parent_of ex:d1_n4 .
ex:d1_n4 a ex:nodeType_C ;
        ex:parent_of ex:d1_n5 .
ex:d1_n5 a ex:nodeType_C .

然后将 DAG 文件和子图形状文件传递给SHACL 规则推理工具 推理器在命令行中像这样运行:

shaclinfer -datafile dagData.ttl -shapesfile dagShapes.ttl

推理器的输出显示 DAG1 与我的子图模式正确关联!

@prefix dash:    <http://datashapes.org/dash#> .
@prefix ex:      <http://example.com/ns#> .
@prefix graphql: <http://datashapes.org/graphql#> .
@prefix owl:     <http://www.w3.org/2002/07/owl#> .
@prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .
@prefix sh:      <http://www.w3.org/ns/shacl#> .
@prefix swa:     <http://topbraid.org/swa#> .
@prefix tosh:    <http://topbraid.org/tosh#> .
@prefix xsd:     <http://www.w3.org/2001/XMLSchema#> .

ex:DAG1  ex:has_subgraph  ex:subGraph1 .

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM