为2个相关表创建RDF并对其运行SPARQL查询

为2个相关表创建RDF并对其运行SPARQL查询,rdf,sparql,jena,Rdf,Sparql,Jena,以下是我的两张表格: CREATE TABLE Tree ( "id" integer NOT NULL, -- Primary key "tags" varchar(500), "rootNode" integer NOT NULL -- Referes to Node table's "id" ); CREATE TABLE Node ( "id" integer NOT NUL

以下是我的两张表格:

CREATE TABLE Tree (
    "id"            integer NOT NULL,   -- Primary key
    "tags"          varchar(500),
    "rootNode"      integer NOT NULL    -- Referes to Node table's "id"
);
CREATE TABLE Node (
    "id"            integer NOT NULL,   -- Primary key
    "parent"        integer NOT NULL,
    "owner"         varchar(500),
    "data"          varchar(500),
    "tags"          varchar(500)
);
我为这些文件创建的公共RDF文件如下:

<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:wp="http://example.com/dm#">
    <wp:WPS rdf:about="http://example.com/">
    <wp:node><rdf:Description>  <wp:id>0</wp:id><wp:parent>-1</wp:parent><wp:owner>Kumar</wp:owner><wp:data>--#ABCDEFGHIJKLMNOPQRSTUVWXYZ#--</wp:data><wp:tags>MyTag</wp:tags></rdf:Description></wp:node>
    .....
    <wp:tree><rdf:Description>  <wp:treeId>814</wp:treeId><wp:treeTags>Banking</wp:treeTags><wp:rootNode>19989</wp:rootNode></rdf:Description></wp:tree>
    .......
</wp:WPS></rdf:RDF>
我尝试使用过滤器使用以下查询,但未能获得所需的结果。正确的方法是什么

    PREFIX wp: <http://example.com/dm#> 
              SELECT ?x ?id 
              WHERE { 
                ?x wp:id ?id .
                ?x wp:trailId ?trailId .
                ?x wp:rootWP ?rootWP .
                FILTER (?trailId = 100)
                FILTER (?rootWP = ?id)
              }
前缀wp:
选择?x?id
何处{
?x wp:id?id。
?x wp:trailId?trailId。
?x wp:rootWP?rootWP。
过滤器(?trailId=100)
过滤器(?rootWP=?id)
}

一般来说,您不应该自己创建数据库表结构来存储RDF三元组。这是一件很复杂的事情,要想让它正常运行就更难了。如果您只想创建一个持久的三重存储,那么可以使用RDF平台的内置功能。就耶拿而言,这将是或


或者,如果您需要将数据存储在关系模式中,但也希望将该数据视为RDF三元组,以便可以使用SPARQL进行查询,则需要一个关系到RDF的映射工具。有,还有开源实现,比如

,我有点困惑。您正在创建自己的关系数据库模式吗?为什么不使用Jena的SDB实现?你用“Jena”标记了这个问题,所以我假设你在使用API?relationall db模式是以两个表的形式显示我的数据以及它们之间的关系,基于此,我创建了我的RDF文件。啊,对不起,我误解了。这听起来像是您创建了一个模式以便创建RDF,而不是该模式已经存在。我不太清楚语句
您不应该自己创建数据库表结构来存储RDF三元组。我想将数据持久保存在TDB中,根据我的理解,我需要一个RDF文件,因此在我的案例中,我最初为
节点
创建了两个RDF文件。由于这两个文件具有我在关系模式中显示的关系,所以我创建了一个rdf文件,并将其保存在TDB模型中。现在尝试查询(sparql)它们。如果我做错了该怎么办?TDB根本不使用关系存储(即数据库)。TDB和SDB都将通过在磁盘上创建b树索引文件为您初始化存储层。首次打开未初始化的存储时,初始化是自动的。除此之外,我不明白这个问题。创建RDF不需要定义SQL表,所以您使用关系模式只是为了记录您正在设计的RDF概念?我想你能做到,但这很不寻常。通常情况下,您会考虑数据模型中的RDFS或OWL类,以及连接这些类的属性。有些人使用UML图来记录这些关系,但就我个人而言,我从未发现这些关系非常有用。感谢@Ian提供的这些信息,我将介绍RDFS和OWL。您的评论是否意味着,即使我们事先知道了这种关系,我们也不应该尝试将它们放在我们的RDF中?我们想要应用的任何连接都应该通过查询?注意:我还用我使用的sparql查询更新了我的问题。这是一个在StackOverflow注释链中讨论的复杂问题。您最好在Jena用户支持列表上问这个问题。简单地说:您绝对应该用RDF表达您的域模型,使用RDFS或OWL作为建模语言。这就是您表达应用程序模型的含义(语义)的方式。SPARQL和SPARQL/update是用于在数据可用时查询或更新数据的技术。这与最初创建域模型是完全不同的。
    PREFIX wp: <http://example.com/dm#> 
              SELECT ?x ?id 
              WHERE { 
                ?x wp:id ?id .
                ?x wp:trailId ?trailId .
                ?x wp:rootWP ?rootWP .
                FILTER (?trailId = 100)
                FILTER (?rootWP = ?id)
              }