检索owl中特定子类的类名

问题描述 投票:1回答:2

我是一个rdflib初学者,我有一个类和子类的本体,我需要在子类中查找特定的单词,如果找到它,则返回其类名。

我有以下代码:

import rdflib
from rdflib import plugin
from rdflib.graph import Graph

g = Graph()
g.parse("test.owl")
from rdflib.namespace import Namespace
plugin.register(
  'sparql', rdflib.query.Processor,
  'rdfextras.sparql.processor', 'Processor')
plugin.register(
  'sparql', rdflib.query.Result,
  'rdfextras.sparql.query', 'SPARQLQueryResult')

qres = g.query("""
  PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
  PREFIX owl: <http://www.w3.org/2002/07/owl#>
  PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
  PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

   SELECT  ?subject ?object
WHERE { ?subject rdfs:subClassOf ?object } 

  """)
# n is asubclass name and its class name is good-behaviour which i want to be the result
n="pity"
for (subj,pred,obj) in qres:
  if n in subj:
    print obj
  else:
    print "not found"

当我print qres的结果它返回一个完整的URL,我只需要子类和类的名称。

有人能帮忙吗。

python-2.7 sparql owl rdflib
2个回答
1
投票

您可以在没有SPARQL和Python字符串操作的情况下使用RDFLib来获得答案。如果您更喜欢使用SPARQL,Joshua Taylor answer to this question将是您的选择。您也不需要使用最新版本(4+)RDFLib的SPARQL处理器插件 - 请参阅"Querying with SPARQL" documentation

要获得您正在寻找的答案,您可以使用RDFLIB Graph方法subject_objects来获取具有您感兴趣的谓词的主题和对象的生成器,rdfs:subClassOf。每个主题和对象都是RDFLib URIRef,它们也是Python unicode对象,可以使用standard Python methods进行操作。要获取IRI的后缀,请调用对象的split方法,并获取返回列表中的最后一项。

以下是您按照描述重新编写的代码。没有数据,我无法完全测试它,但是当使用不同的本体时,这对我有用。

from rdflib import Graph
from rdflib.namespace import RDFS

g = Graph()
g.parse("test.owl")

# n is a subclass name and its class name is good-behaviour
# which i want to be the result
n = "pity"

for subj, obj in g.subject_objects(predicate=RDFS.subClassOf):
    if n in subj:
        print obj.rsplit('#')[-1]
    else:
        print 'not found'

1
投票

您没有显示您的数据,因此我无法使用您的确切查询或数据,但根据您的评论,听起来您正在获取IRI(例如,http://www.semanticweb.org/raya/ontologies/test6#Good-behaviour)作为结果,而您只需要字符串Good-behaviour。你可以使用strafter来做到这一点。例如,如果您有这样的数据:

@prefix : <http://stackoverflow.com/questions/20830056/> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>

:retrieving-the-class-name-of-a-specific-subclass-in-owl 
  rdfs:label "retrieving the class name of a specific subclass in owl"@en .

然后像这样的查询将返回具有完整IRI的结果:

prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>

select ?question where { 
  ?question rdfs:label ?label .
}
---------------------------------------------------------------------------------------------------------
| question                                                                                              |
=========================================================================================================
| <http://stackoverflow.com/questions/20830056/retrieving-the-class-name-of-a-specific-subclass-in-owl> |
---------------------------------------------------------------------------------------------------------

您可以使用strafter在其他字符串之后获取字符串的一部分。例如。,

prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>

select ?q where { 
  ?question rdfs:label ?label .
  bind(strafter(str(?question),"http://stackoverflow.com/questions/20830056/") as ?q)
}
-------------------------------------------------------------
| q                                                         |
=============================================================
| "retrieving-the-class-name-of-a-specific-subclass-in-owl" |
-------------------------------------------------------------

如果您在查询中定义前缀,例如,作为so:,那么您也可以使用str(so:)而不是字符串形式。如果您愿意,还可以在变量列表中进行字符串操作,而不是图形模式。这看起来像这样:

prefix so: <http://stackoverflow.com/questions/20830056/> 
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>

select (strafter(str(?question),str(so:)) as ?q) where { 
  ?question rdfs:label ?label .
}
-------------------------------------------------------------
| q                                                         |
=============================================================
| "retrieving-the-class-name-of-a-specific-subclass-in-owl" |
-------------------------------------------------------------
© www.soinside.com 2019 - 2024. All rights reserved.