java - 获取不同的谓词并从 RDF 中的谓词中提取前缀

标签 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 ."
            + "}";

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

最佳答案

您的谓词 URI 都包含“本体”一词...您实际上有本体吗?您是否了解本体不同于任何自由形式的链接数据三元组?上课在哪里<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()是一个便利函数,因此您不必键入此正则表达式 replace备注:REPLACE(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 ,在我看来这不是一个无类型字符串。

关于java - 获取不同的谓词并从 RDF 中的谓词中提取前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44854630/

相关文章:

Java 快速排序

java - 如何使用带有 Java 的 Selenium WebDriver 关闭特定窗口?

java - 使用 jool java 8 使用 Seq、Tuple 和 Streams 进行左外连接

sparql - OWL本体: SPARQL query a range or domain of an ObjectProperty when they're unionOf classes

java - 从 SPARQL 结果中的文字中删除数据类型

rdf - 如何构建正确的 SPARQL 查询

eclipse - 使用 Java 对 DBPedia 进行 SPARQL 查询

rdf - 如何加快阅读速度

Java RSA 加密 - 解密 .NET

java - 如何在调用方法 FileManager.get().loadModel(url) 期间获取 apache jena 中的 http 响应 header