首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在RDF中获取不同的谓词并从谓词中提取前缀。

在RDF中获取不同的谓词并从谓词中提取前缀。
EN

Stack Overflow用户
提问于 2017-06-30 20:48:43
回答 1查看 922关注 0票数 0

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

代码语言:javascript
复制
"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作为谓词,这些谓词将用于相应地获取它们的对象值。现在,我要这么做:

代码语言:javascript
复制
"prefix j.0`<http://something.dk/ontology/business/>" +
            "select ?a ?b where {" +
            " ?Name j.0:name ?a ."
            + " ?Name j.0:id ?b ."
            + "}";

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-01 17:54:05

谓词URI都包含“本体论”一词.,你真的有本体论吗?,你明白本体不同于任何自由形式的链接数据三元组吗?定义的类<http://something.dk/ontology/business/village>和谓词<http://something.dk/ontology/business/population>在哪里?

换句话说,对于这些数据是三倍的:

代码语言:javascript
复制
prefix : <http://something.dk/ontology/business/>
<http://something.dk/resource/business/community/326> :name "Akalia" ; 
    a :village ;
    :id "326" ;
    :population "2000" ;
    :area "30" .

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

代码语言:javascript
复制
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这样的三叉戟中,那么这个查询:

代码语言:javascript
复制
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
  }

返回此结果:

代码语言:javascript
复制
+-----------------------------------------------------+------+--------+
|                          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给出糟糕的建议,但我确实会敦促您养成使用适当的本体,而不是字符串操作的习惯。

代码语言:javascript
复制
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;#)([^#/]*)$", "$3")

代码语言:javascript
复制
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,而不是一个非类型字符串。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44854630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档