![](/img/trans.png)
[英]What is is the simplest way to setup a local rdf triple store with SPARQL endpoint?
[英]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
。 我匹配的这个模式在下图中以黄色突出显示。
子图模式可以编码为如下所示的 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.