【问题标题】:SPARQL query to retrieve individuals of a classSPARQL 查询检索某个类的个体
【发布时间】:2013-09-11 01:45:35
【问题描述】:

我正在尝试用 Java 中的 rdf:type Jena 检索一个类的个体(注意:该类没有子类)。

数据(x 个人):

A 类:x1、x2、x3、x4 B 类:x5、x6、x7、x8 C 类:x9、x10、x11、 x12

对象属性:z1(CLASS A 和 B)、z2(CLASS A 和 C)、z3(CLASS B 与 C)

rdf 的结果:CLassA 的类型:

在 Protege 中:x1、x2、x3、x4 在 Eclipse 中通过 jena:x1、x2、x3、x4、 x5, x6, x7, x8, x9....

Select ?x
where { ?x rdf:type :ClassA }

在本体编辑器中它可以完美运行。但是,在 Java 中,当我执行查询时,我还会得到不属于该类的个体,但它们通过属性与类个体之一连接。任何人都知道如何解决这个问题?本体是正确的。

  • 我在 java 中使用 eclipse 作为编辑器
  • 我正在使用 Protege 构建本体

Eclipse/耶拿:

PropertyConfigurator.configure("D:\\apache-jena-2.10.1\\jena-log4j.properties");
OntModel model = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM_MICRO_RULE_INF);
FileManager.get().readModel( model, "file:.owl" );

String queryString =
    "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#> " +
    "PREFIX bio: <http://www.semanticweb.org/vassilis/ontologies/2013/5/Bio#> " +

    " SELECT ?x " +
    " WHERE { ?x rdf:type bio:Class } " ;

Query query = QueryFactory.create(queryString);
QueryExecution qe= QueryExecutionFactory.create(query, model);
com.hp.hpl.jena.query.ResultSet resultset = qe.execSelect();
ResultSetFormatter.out(System.out, resultset, 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#> 
PREFIX bio: <http://www.semanticweb.org/vassilis/ontologies/2013/5/Bio#> 

SELECT ?x 
WHERE { ?x rdf:type bio:ClassA }

【问题讨论】:

  • 请显示您正在查询的 RDF 数据、您正在运行的 SPARQL 查询以及您获得的实际结果。如果可能,您用于运行查询的代码也可能会有所帮助。如果没有这些数据,几乎不可能诊断出您的问题。
  • 您使用 Protégé 进行了标记,因此当您说“在本体编辑器中它可以完美运行”时,我假设您指的是 Protégé 而不是 Eclipse,尽管“我使用 Eclipse 作为编辑器”。您是否在 Protégé 中运行相同的查询?或许你可以附上截图?
  • 我没有收到错误,也没有在 Protege 或 Eclipse 中。但是我确实得到了不属于我在 eclipse 中查询的类的个人,而在 protege 中我得到了正确的查询结果。
  • 感谢您的澄清。正如我在第一条评论中所问的那样,请显示您的数据和您正在使用的实际 SPARQL 查询(问题中的查询不可能是它,因为前缀 :rdf: 没有在其中定义),您从每个中获得的结果,可能还有您正在运行的 Java 代码。如果没有看到数据,我们作为用户就无法知道 Protégé 是否有问题,或者 Jena 是否有问题,或者是什么。我们需要数据。
  • 您的更新出现在我发布最后一条评论时。感谢您的代码。 (虽然,它并不完全完整,model 来自哪里?)。不过,我们仍然需要本体。

标签: java sparql jena protege


【解决方案1】:

如果本体是正确的,那么你能告诉我们你的代码吗?

你确定 ":Class" 是正确的吗?

如果默认命名空间是 owl 或其他词汇表,那么它可能会返回使用该词汇表的所有个人,或者可能会返回 Jena 中使用的推理规则的差异。这是一个假设。

【讨论】:

  • owl:类看起来更有可能。
  • 是猫头鹰。也许是这样,但我能做些什么来解决它
  • @user2598911 如果您要查找课程,请查询?x rdf:type owl:Class。如果您正在寻找bio:ClassA 的实例,请查询?x rdf:type bio:ClassA
  • 我正在寻找类的实例。问题是在eclipse中它都会显示不属于该类的实例。在 Proteges sparql 中,它显示了正确的实例
【解决方案2】:

检查数据类型属性的域和范围 例如,在 z3 中,如果您将 z3 的域设置为 A 类,则参与此属性的每个个体都被视为 A 类的成员,尽管您在本体中将该个体指定为 B 类个体

【讨论】:

    猜你喜欢
    • 2021-12-02
    • 2016-10-10
    • 1970-01-01
    • 2017-06-25
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多