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

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

我正在创建一个编码有向无环图 (DAG) 的数据库,其中节点是 RDF 实例,边是对象属性。最终,我想创建 SPARQL 查询来匹配我的 DAG 集中的图形模式。我对许多 (~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 查询相同的内容。

感谢任何反馈!

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

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

另一种方法是使用 SHACL Advanced Features vocabulary. You could store your ?dag variable as the ?this variable in a shape graph (see the section about SPARQL-Based Targets)。然后,您可以将模式存储在 sh:select 谓词之后,并使用 select 查询作为查找 dag.

的模式

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

在下面的示例中,有两个 DAG——DAG1DAG2——它们的节点可以具有三种可能的节点标签:ABC。对于此示例,我想找到具有 C<--B-->C 模式的 DAG,然后创建一个新的三元组链接该 DAG 与表示此子图的实例:

ex:DAG ex:has_subgraph ex:subGraph1

我匹配的这个图案在下图中以黄色突出显示:

子图模式可以被编码成如下所示的 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 rule inference tool。推理器在命令行中是这样的运行:

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 .