2

这是我上一个问题的后续问题,因为我仍在为这个主题而苦苦挣扎......我需要从我的模型中选择一些满足特定要求的主题......

如果我列出我的陈述(这只是输出的一小部分),我会得到如下信息:

WorkOrder2 hasType Workorder .
WorkOrder2 hasResult Fuselage22 .
WorkOrder2 type NamedIndividual .

现在,我想选择并迭代所有hasType Workorder. 我的想法是这样的:

public static ArrayList<String> listAllWorkorders(Model model) {
        ArrayList<String> workorders = new ArrayList<String>();

        // list of all work orders associated with given fuselage and work
        // station
        ResIterator it = model.listSubjectsWithProperty(
                ResourceFactory.createProperty(ArumCorePrefix + "hasType"), ArumCorePrefix + "Workorder");
        while (it.hasNext()) {
            Resource r = it.next();
            String workorder = trimPrefix(r.toString());

            workorders.add(workorder);

        }

        // sort the result alphabetically
        Collections.sort(workorders);

        return workorders;
    }

但是,它不会返回任何东西......如果我listSubjectsWithProperty不使用第二个参数(字符串),它会起作用,但不仅会返回 Workorders,还会返回一些带有hasType属性的东西,这是我不想要的。我的代码有什么问题!我可以使用这样的东西并让它工作吗?不用担心static这个功能的使用(一旦我知道有什么问题,我会处理这种不优雅的方式。)

此外,我想实现一些更复杂的过滤 - 例如选择具有多个属性的主题,所有这些属性都必须匹配才能返回它们,hasType Workorder, hasResult someResult, inStation station等等...... Jena 是否支持这样的东西!如果没有,常见的方法是什么?

感谢您的任何提示!

以及后续行动:如何检查我的模型中是否存在某些语句?我知道有model.contains(Statements s)方法,但我是否必须在 roder 的参数中创建语句才能调用此方法?没有更优雅的方式model.contains(Resource r, Property p, Resource o)吗?

4

1 回答 1

2

在耶拿有很多方法可以做到这一点,但它们主要归结为打电话

将资源作为第一个参数,null第二个和第三个参数作为通配符。做类似事情的其他方法实际上只是这种情况的特例。例如,

  • listObjectsOfProperty(Property p)-listStatements(null,p,null)并从每个语句中获取对象。
  • listObjectsOfProperty(Resource s, Property p)-listStatements(s,p,null)并从每个语句中获取对象。
  • listResourcesWithProperty(Property p)-listStatements(null,p,null)并从每个陈述中获取主题
  • listResourcesWithProperty(Property p, RDFNode o)-listStatements(null,p,o)并从每个陈述中获取主题

为方便起见,您可能更喜欢使用该方法

它以给定资源作为主题返回资源模型中所有语句的迭代器。

下面是一些示例代码,其中包含您的模型并使用这些方法中的每一个:

import java.io.ByteArrayInputStream;

import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.RDFNode;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.rdf.model.StmtIterator;

public class ResourcePropertiesExample {
    final static String NS = "http://example.org/";
    final static String modelText = "" +
            "@prefix : <"+NS+"> .\n" +
            ":WorkOrder2 :hasType :Workorder .\n" +
            ":WorkOrder2 :hasResult :Fuselage22 .\n" +
            ":WorkOrder2 :type :NamedIndividual .\n" +
            "";

    public static void main(String[] args) {
        final Model model = ModelFactory.createDefaultModel();
        model.read( new ByteArrayInputStream( modelText.getBytes()), null, "TTL" );
        final Resource workOrder2 = model.getResource( NS+"WorkOrder2" );

        System.out.println( "Using Model.listStatements()" );
        StmtIterator stmts = model.listStatements( workOrder2, null, (RDFNode) null );
        while ( stmts.hasNext() ) {
            System.out.println( stmts.next() );
        }

        System.out.println( "Using Resource.listProperties()" );
        stmts = workOrder2.listProperties();
        while ( stmts.hasNext() ) {
            System.out.println( stmts.next() );
        }
    }
}

输出是:

Using Model.listStatements()
[http://example.org/WorkOrder2, http://example.org/type, http://example.org/NamedIndividual]
[http://example.org/WorkOrder2, http://example.org/hasResult, http://example.org/Fuselage22]
[http://example.org/WorkOrder2, http://example.org/hasType, http://example.org/Workorder]
Using Resource.listProperties()
[http://example.org/WorkOrder2, http://example.org/type, http://example.org/NamedIndividual]
[http://example.org/WorkOrder2, http://example.org/hasResult, http://example.org/Fuselage22]
[http://example.org/WorkOrder2, http://example.org/hasType, http://example.org/Workorder]

至于检查模型是否包含某些语句,如您所述,您可以使用 Model.contains,我认为这没有什么问题。您还可以使用各种 Resourcehas*方法,例如

  • hasLiteral( 属性 p, [各种类型的文字] )
  • hasProperty( 属性 p, RDFNode / String / String, String )

使用这些,您可以使用,继续上面的示例,并假设您定义了属性hasResult和资源fuselage21,并且fuselage22

workOrder2.hasProperty( hasResult, fuselage21 ); // false
workOrder2.hasProperty( hasResult, fuselage22 ); // true
于 2013-09-17T14:30:58.457 回答