从RDF中的谓词获取不同的谓词和提取前缀

时间:2017-06-30 20:48:44

标签: java sparql apache-jena

我有一个.ttl文件。我想从中提取所有不同的谓词。我正在使用Apache-jena。为此,我使用了 SPARQL 命令:

"SELECT DISTINCT ?property WHERE {" +
            " ?s ?property ?o ."
            + "}";

我得到的结果是这样的:

<http://something.dk/ontology/business/name <http://something.dk/ontology/business/id

我想要的是摆脱这个前缀,

<http://something.dk/ontology/business/

并仅获取nameid作为谓词,这些谓词将用于相应地获取其对象值。现在,我这样做:

"prefix j.0`<http://something.dk/ontology/business/>" +
            "select ?a ?b where {" +
            " ?Name j.0:name ?a ."
            + " ?Name j.0:id ?b ."
            + "}";

但由于可能存在其他一些属性,因此效率不高。如何在没有前缀的情况下从模型中获取所有谓词,并使用这些谓词来获取对象值?

1 个答案:

答案 0 :(得分:2)

你的谓词URI都包含单词&#34;本体&#34; ... 你真的有本体吗?你是否理解本体不同于任何自由形式的链接数据三倍?类<http://something.dk/ontology/business/village>和谓词<http://something.dk/ontology/business/population> 定义在哪里

换句话说,对于这些数据三元组:

prefix : <http://something.dk/ontology/business/>
<http://something.dk/resource/business/community/326> :name "Akalia" ; 
    a :village ;
    :id "326" ;
    :population "2000" ;
    :area "30" .

我希望至少看到以下最小的本体论:

prefix : <http://something.dk/ontology/business/> .
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#> .

:madman.owl rdf:type owl:Ontology .

:area rdf:type owl:DatatypeProperty ;
    rdfs:label "area" .

:id rdf:type owl:DatatypeProperty ;
    rdfs:label "id" .

:name rdf:type owl:DatatypeProperty ;
    rdfs:label "name" .

:area rdf:type owl:DatatypeProperty ;
    rdfs:label "area" .

:village rdf:type owl:Class ;
    rdfs:label "village" .

如果您将数据和本体加载到像Jena Fuseki这样的三元组中,则此查询:

PREFIX  :     <http://something.dk/ontology/business/>
PREFIX  rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT  ?v ?l ?o
WHERE
  { ?v  a                     :village ;
        ?p                    ?o .
    ?p  rdfs:label            ?l
  }

返回此结果:

+-----------------------------------------------------+------+--------+
|                          v                          |  l   |   o    |
+-----------------------------------------------------+------+--------+
| http://something.dk/resource/business/community/326 | id   | 326    |
| http://something.dk/resource/business/community/326 | area | 30     |
| http://something.dk/resource/business/community/326 | name | Akalia |
+-----------------------------------------------------+------+--------+

如果您使用Jena的其他方式访问RDF内容,您可以使用相同的查询,但您必须使用不同的方法来组合数据三元组和三元组本体。

@ AKSW的评论是为此特定任务执行子字符串删除的一种方法。具体来说,我们将从每个URI中删除默认:前缀的内容。更通用的功能是replace()

我从未见过@AKSW给出错误的建议,但我真的会敦促你养成使用正确本体的习惯,而不是字符串操作解决方法。

PREFIX  :     <http://something.dk/ontology/business/>
SELECT  ?v ?extrLabel ?o
WHERE
  { ?v  a                     :village ;
        ?p                    ?o
    BIND(strafter(str(?p), str(:)) AS ?extrLabel)
  }
@Stanislav也知道他的东西。我认为afn:localname()是一项便利功能,因此您不必输入此正则表达式replaceREPLACE(STR(?x), "^(.*)(/&#124;#)([^#/]*)$", "$3")

PREFIX  :     <http://something.dk/ontology/business/>
PREFIX  afn:  <http://jena.apache.org/ARQ/function#>
SELECT  ?v ?extrLabel ?o
WHERE
  { ?v  a                     :village ;
        ?p                    ?o
    BIND(afn:localname(?p) AS ?extrLabel)
  }

有趣的练习是获取或合成数千个像你提供的三元组,并计算这三种不同标记方法的表现。

此外,使用本体,您可以设置数据类型属性的域和范围,例如population。在我看来,这应该是一个xsd:integer,而不是一个无类型的字符串。

相关问题