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

Get distinct Predicates and Extract prefix from Predicates in RDF

我有一个 .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 ."
            + "}";

但这并不有效,因为可能还有一些其他属性。如何从没有前缀的模型中获取所有谓词并使用这些谓词获取对象值?

你的谓词 URI 都包含单词 "ontology"... 你真的有一个 ontology 吗? 你明白 ontology 与任何自由形式的链接数据三元组不同? class <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" .

我希望至少看到以下最小值 ontology:

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" .

如果您将数据和 ontology 都加载到像 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
  }

Returns这个结果:

+-----------------------------------------------------+------+--------+
|                          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 内容的方法之一,您可以使用相同的查询,但您必须使用不同的方法来组合数据三元组和来自 ontology.

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

我从未见过@AKSW 给出过糟糕的建议,但我强烈建议您养成正确使用 ontology 的习惯,而不是字符串操作解决方法。

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() 是一个方便的函数,所以你不必输入这个正则表达式 replacement: REPLACE(STR(?x), "^(.*)(/&#124;#)([^#/]*)$", "")

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)
  }

一个有趣的练习是像您提供的那样获取或合成数千个三元组,并对这三种不同标记方法的性能进行计时。

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