有没有办法将 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——DAG1
和 DAG2
——它们的节点可以具有三种可能的节点标签:A
、B
或 C
。对于此示例,我想找到具有 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 .
我正在创建一个编码有向无环图 (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
.
按照
在下面的示例中,有两个 DAG——DAG1
和 DAG2
——它们的节点可以具有三种可能的节点标签:A
、B
或 C
。对于此示例,我想找到具有 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 .