Список доменов, которые содержат строку - PullRequest
1 голос
/ 07 августа 2011

Прежде всего, я новичок в Йене.Я создал онтологию и у меня есть 4 класса, процедура, покупатель, поставщик и почтовый индекс. И у меня есть следующие свойства:

  1. Процедура hasBuyer Покупатели
  2. Процедура hasSupplierПоставщик
  3. Поставщик hasZipCode Почтовый индекс
  4. Покупатель hasZipCode Почтовый индекс

Что я хочу знать, это лучший способ в Йене вернуть все домены, которые содержатстрока "3333".

Например:

  • Процедура 1: покупатель 1 с почтовым индексом 333, поставщик 1 с почтовым индексом 333 и поставщик2 с почтовым индексом 334.
  • У процедуры 2 есть покупатель 2 с почтовым индексом 331, поставщик 2 с почтовым индексом 334 и поставщик2 с почтовым индексом 335.
  • У процедуры 3 есть покупатель 3 с почтовым индексом 333, поставщик 1 с почтовым индексом 333 и поставщик3 спочтовый индекс 335.

Результаты должны быть:

  • Процедуры - Процедура1 и Процедура3
  • Покупатель - Покупатель1 и Покупатель 3
  • Поставщик - поставщик1

НГ

1 Ответ

1 голос
/ 08 августа 2011

Прежде всего, вы не можете использовать «поставщик 2 с почтовым индексом 334», а затем «поставщик 2 с почтовым индексом 335», потому что это тот же человек, и вы увидите «поставщик 2 с почтовым индексом 334». и почтовый индекс 334 "в приложении оба раза.

Есть несколько вариантов реализации.

С простым API Jena:

Model model; // your model
Resource supplierClass = model.getResource(YOUR_NS + "Supplier");
Resource buyerClass = model.getResource(YOUR_NS + "Buyer");
Resource procClass = model.getResource(YOUR_NS + "Procedure");
Property zipCodeProp = model.getProperty(YOUR_NS + "zipCode");
Property hasBuyerProp = model.getProperty(YOUR_NS + "hasBuyer");
Property hasSupplierProp = model.getProperty(YOUR_NS + "hasSupplier");
StmtIterator iter = 
        model.listStatements(new SimpleSelector(null, zipCodeProp, "333"));
while (iter.hasNext()) {
    Resource subject = iter.next().getSubject();
    if (!subject.hasProperty(RDF.type))
        continue;
    Resource subjectClass = subject.getPropertyResourceValue(RDF.type);
    SimpleSelector sel;
    if (subjectClass.equals(supplierClass))
        sel = new SimpleSelector(null, hasSupplierProp, subject);
    else if (subjectClass.equals(buyerClass))
        sel = new SimpleSelector(null, hasBuyerProp, subject);
    else
        continue;
    StmtIterator innerIter = model.listStatements(sel);
    while (innerIter.hasNext()) {
        Resource proc = innerIter.next().getSubject();
        if (!proc.hasProperty(RDF.type) || 
                !proc.getPropertyResourceValue(RDF.type).equals(procClass))
            continue;
        // now you can retrieve linked entities from this procedure
    }
}

И SPARQL-запрос:

PREFIX yourns: <YOUR_NS>
SELECT DISTINCT ?proc
{
    ?proc a yourns:Procedure;
          yourns:hasBuyer ?buyer;
          yourns:hasSupplier ?supplier.
    ?supplier zipCode ?supplierZip.
    ?buyer zipCode ?buyerZip.
    FILTER (?supplierZip = '333' || ?buyerZip = '333')
}

с дальнейшим использованием ARQ:

Query query = QueryFactory.create(queryString);
QueryExecution qe = QueryExecutionFactory.create(query, model);
ResultSet results = qe.execSelect();
while (results.hasNext()) {
    QuerySolution qs = results.next();
Resource proc = qs.getResource("proc");
    // now again you can retrieve linked entities
}
...