trustgraph/docs/tech-specs/ontology-extract-phase-2.tr.md
Alex Jenkins 8954fa3ad7 Feat: TrustGraph i18n & Documentation Translation Updates (#781)
Native CLI i18n: The TrustGraph CLI has built-in translation support
that dynamically loads language strings. You can test and use
different languages by simply passing the --lang flag (e.g., --lang
es for Spanish, --lang ru for Russian) or by configuring your
environment's LANG variable.

Automated Docs Translations: This PR introduces autonomously
translated Markdown documentation into several target languages,
including Spanish, Swahili, Portuguese, Turkish, Hindi, Hebrew,
Arabic, Simplified Chinese, and Russian.
2026-04-14 12:08:32 +01:00

24 KiB
Raw Blame History

layout title parent
default Ontoloji Bilgi Çıkarma - 2. Aşama Yeniden Düzenleme Turkish (Beta)

Ontoloji Bilgi Çıkarma - 2. Aşama Yeniden Düzenleme

Beta Translation: This document was translated via Machine Learning and as such may not be 100% accurate. All non-English languages are currently classified as Beta.

Durum: Taslak Yazar: Analiz Oturumu 2025-12-03 İlgili: ontology.md, ontorag.md

Genel Bakış

Bu belge, mevcut ontoloji tabanlı bilgi çıkarma sistemindeki tutarsızlıkları belirlemektedir ve LLM performansını iyileştirmek ve bilgi kaybını azaltmak için bir yeniden düzenleme önermektedir.

Mevcut Uygulama

Şu Anda Nasıl Çalışıyor

  1. Ontoloji Yükleme (ontology_loader.py) "fo/Recipe", "fo/Food", "fo/produces" gibi anahtarlara sahip ontoloji JSON'unu yükler. Sınıf kimlikleri, anahtar içinde namespace önekini içerir. food.ontology'dan bir örnek:

    "classes": {
      "fo/Recipe": {
        "uri": "http://purl.org/ontology/fo/Recipe",
        "rdfs:comment": "A Recipe is a combination..."
      }
    }
    
  2. İstem Oluşturma (extract.py:299-307, ontology-prompt.md) Şablon, classes, object_properties, datatype_properties sözlüklerini alır. Şablon döngüye girer: {% for class_id, class_def in classes.items() %} LLM (Büyük Dil Modeli) şunları görür: **fo/Recipe**: A Recipe is a combination... Örnek çıktı formatı şöyledir:

    {"subject": "recipe:cornish-pasty", "predicate": "rdf:type", "object": "Recipe"}
    {"subject": "recipe:cornish-pasty", "predicate": "has_ingredient", "object": "ingredient:flour"}
    
  3. Yanıt Ayrıştırma (extract.py:382-428) JSON dizisi beklenir: [{"subject": "...", "predicate": "...", "object": "..."}] Ontoloji alt kümesine göre doğrulanır. URI'lar expand_uri() aracılığıyla genişletilir (extract.py:473-521).

  4. URI Genişletme (extract.py:473-521) Değerin ontology_subset.classes sözlüğünde olup olmadığını kontrol eder. Bulunursa, URI sınıf tanımından çıkarılır. Bulunmazsa, URI oluşturulur: f"https://trustgraph.ai/ontology/{ontology_id}#{value}"

Veri Akışı Örneği

Ontoloji JSON → Yükleyici → İstek:

"fo/Recipe" → classes["fo/Recipe"] → LLM sees "**fo/Recipe**"

LLM → Ayrıştırıcı → Çıktı:

"Recipe" → not in classes["fo/Recipe"] → constructs URI → LOSES original URI
"fo/Recipe" → found in classes → uses original URI → PRESERVES URI

Belirlenen Sorunlar

1. İstemde Tutarsız Örnekler

Sorun: İstem şablonu, sınıf kimliklerini öneklerle (fo/Recipe) gösterirken, örnek çıktı önek kullanılmayan sınıf adlarını kullanır (Recipe).

Konum: ontology-prompt.md:5-52

## Ontology Classes:
- **fo/Recipe**: A Recipe is...

## Example Output:
{"subject": "recipe:cornish-pasty", "predicate": "rdf:type", "object": "Recipe"}

Etki: LLM, hangi formatı kullanması gerektiği konusunda çelişkili sinyaller alır.

2. URI Genişletmesinde Bilgi Kaybı

Sorun: LLM, örneğe uygun olarak önekli olmayan sınıf adları döndürdüğünde, expand_uri() bunları ontoloji sözlüğünde bulamaz ve yedek URI'ler oluşturur, böylece orijinal doğru URI'ler kaybolur.

Konum: extract.py:494-500

if value in ontology_subset.classes:  # Looks for "Recipe"
    class_def = ontology_subset.classes[value]  # But key is "fo/Recipe"
    if isinstance(class_def, dict) and 'uri' in class_def:
        return class_def['uri']  # Never reached!
return f"https://trustgraph.ai/ontology/{ontology_id}#{value}"  # Fallback

Etki: Orijinal URI: http://purl.org/ontology/fo/Recipe Oluşturulmuş URI: https://trustgraph.ai/ontology/food#Recipe Anlamsal anlam kayboluyor, birlikte çalışabilirlik bozuluyor.

3. Belirsiz Varlık Örneği Biçimi

Sorun: Varlık örneği URI biçimi hakkında net bir rehberlik yok.

İpuçlarındaki örnekler: "recipe:cornish-pasty" (namespace benzeri önek) "ingredient:flour" (farklı önek)

Gerçek davranış (extract.py:517-520):

# Treat as entity instance - construct unique URI
normalized = value.replace(" ", "-").lower()
return f"https://trustgraph.ai/{ontology_id}/{normalized}"

Etki: LLM'nin, herhangi bir ontoloji bağlamı olmadan, önekleme kuralını tahmin etmesi gerekir.

4. Ada Alanı Önekleri Hakkında Rehberlik Yok

Sorun: Ontoloji JSON dosyası, ada alanı tanımlarını içerir (food.ontology dosyasının 10-25. satırları):

"namespaces": {
  "fo": "http://purl.org/ontology/fo/",
  "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
  ...
}

Ancak bunlar asla LLM'ye iletilmez. LLM şunları bilmez: "fo" kelimesinin ne anlama geldiğini Varlıklar için hangi öneklerin kullanılması gerektiğini Hangi ad alanının hangi öğelere uygulandığını

5. İpuçunda Kullanılmayan Etiketler

Sorun: Her sınıfın rdfs:label alanları vardır (örneğin, {"value": "Recipe", "lang": "en-gb"}), ancak ipucu şablonu bunları kullanmaz.

Mevcut durum: Sadece class_id ve comment gösteriliyor.

- **{{class_id}}**{% if class_def.comment %}: {{class_def.comment}}{% endif %}

Kullanılabilir ancak kullanılmayan:

"rdfs:label": [{"value": "Recipe", "lang": "en-gb"}]

Etki: Teknik kimliklerin yanı sıra insan tarafından okunabilir isimler sağlayabilir.

Önerilen Çözümler

Seçenek A: Önek Olmayan Kimliklere Normalleştirme

Yaklaşım: Sınıf kimliklerinden önekleri, LLM'ye göstermeden önce kaldırın.

Değişiklikler:

  1. build_extraction_variables()'ı, anahtarları dönüştürmek için değiştirin:

    classes_for_prompt = {
        k.split('/')[-1]: v  # "fo/Recipe" → "Recipe"
        for k, v in ontology_subset.classes.items()
    }
    
  2. İstem örneğini, (zaten önek kullanmayan) mevcut duruma uygun hale getirin.

  3. expand_uri()'ı, her iki formatı da işleyebilecek şekilde değiştirin:

    # Try exact match first
    if value in ontology_subset.classes:
        return ontology_subset.classes[value]['uri']
    
    # Try with prefix
    for prefix in ['fo/', 'rdf:', 'rdfs:']:
        prefixed = f"{prefix}{value}"
        if prefixed in ontology_subset.classes:
            return ontology_subset.classes[prefixed]['uri']
    

Artıları: Daha temiz, daha insan tarafından okunabilir Mevcut örnek istemlerle eşleşir Büyük dil modelleri (LLM'ler), daha basit belirteçlerle daha iyi çalışır

Eksileri: Birden fazla ontolojinin aynı sınıf adına sahip olması durumunda sınıf adı çakışmaları Ad alanı bilgilerini kaybettirir Arama işlemlerinde yedekleme mantığı gerektirir

B Seçeneği: Tam Önekli Kimlikleri Tutarlı Bir Şekilde Kullanın

Yaklaşım: Örnekleri, sınıf listesinde gösterilenlerle eşleşen önekli kimlikleri kullanacak şekilde güncelleyin.

Değişiklikler:

  1. Örnek istemi güncelleyin (ontology-prompt.md:46-52):

    [
      {"subject": "recipe:cornish-pasty", "predicate": "rdf:type", "object": "fo/Recipe"},
      {"subject": "recipe:cornish-pasty", "predicate": "rdfs:label", "object": "Cornish Pasty"},
      {"subject": "recipe:cornish-pasty", "predicate": "fo/produces", "object": "food:cornish-pasty"},
      {"subject": "food:cornish-pasty", "predicate": "rdf:type", "object": "fo/Food"}
    ]
    
  2. İstemde (prompt) ad alanııklamasını ekleyin:

    ## Namespace Prefixes:
    - **fo/**: Food Ontology (http://purl.org/ontology/fo/)
    - **rdf:**: RDF Schema
    - **rdfs:**: RDF Schema
    
    Use these prefixes exactly as shown when referencing classes and properties.
    
  3. expand_uri()'ı olduğu gibi tutun (eşleşmeler bulunduğunda doğru şekilde çalışır).

Avantajları: Giriş = Çıkış tutarlılığı Bilgi kaybı yok Ada alanı semantiğini korur Birden fazla ontoloji ile çalışır

Dezavantajları: LLM için daha ayrıntılı belirteçler LLM'nin önekleri takip etmesini gerektirir

Seçenek C: Hibrit - Hem Etiketi Hem de Kimliği Gösterin

Yaklaşım: İnsan tarafından okunabilir etiketleri ve teknik kimlikleri göstermek için istemi geliştirin.

Değişiklikler:

  1. İstem şablonunu güncelleyin:

    {% for class_id, class_def in classes.items() %}
    - **{{class_id}}** (label: "{{class_def.labels[0].value if class_def.labels else class_id}}"){% if class_def.comment %}: {{class_def.comment}}{% endif %}
    {% endfor %}
    

    Örnek çıktı:

    - **fo/Recipe** (label: "Recipe"): A Recipe is a combination...
    
  2. Güncelleme talimatları:

    When referencing classes:
    - Use the full prefixed ID (e.g., "fo/Recipe") in JSON output
    - The label (e.g., "Recipe") is for human understanding only
    

Avantajları: LLM için en anlaşılır olanı Tüm bilgileri korur Ne kullanılması gerektiği konusunda açık

Dezavantajları: Daha uzun bir istem Daha karmaşık bir şablon

Uygulanan Yaklaşım

Basitleştirilmiş Varlık-İlişki-Özellik Formatı - eski üçlü tabanlı formatın tamamen yerini alır.

Bu yeni yaklaşım aşağıdaki nedenlerle seçilmiştir:

  1. Bilgi Kaybı Yok: Orijinal URI'ler doğru şekilde korunur
  2. Daha Basit Mantık: Dönüştürmeye gerek yoktur, doğrudan sözlük aramaları çalışır
  3. Ad Alanı Güvenliği: Çakışmalar olmadan birden fazla ontolojiyi işler
  4. Anlamsal Doğruluk: RDF/OWL semantiğini korur

Uygulama Tamamlandı

Oluşturulanlar:

  1. Yeni İstek Şablonu (prompts/ontology-extract-v2.txt) ık bölümler: Varlık Türleri, İlişkiler, Özellikler Tam tür tanımlayıcılarını kullanan örnek (fo/Recipe, fo/has_ingredient) Şemadan tam tanımlayıcıları kullanma talimatları Varlıklar/ilişkiler/özellikler dizileri içeren yeni JSON formatı

  2. Varlık Normalizasyonu (entity_normalizer.py) normalize_entity_name() - İsimleri URI'ye uygun formata dönüştürür normalize_type_identifier() - Türlerdeki eğik çizgileri işler (fo/Recipefo-recipe) build_entity_uri() - (isim, tür) tuple'ını kullanarak benzersiz URI'ler oluşturur EntityRegistry - Tekrarlamayı önlemek için varlıkları takip eder

  3. JSON Ayrıştırıcı (simplified_parser.py) Yeni formatı ayrıştırır: {entities: [...], relationships: [...], attributes: [...]} kebab-case ve snake_case alan adlarını destekler Yapılandırılmış veri sınıfları döndürür Günlükleme ile zarif hata işleme

  4. Üçlü Dönüştürücü (triple_converter.py) convert_entity() - Tür + etiket üçlülerini otomatik olarak oluşturur convert_relationship() - Varlık URI'lerini özellikler aracılığıyla bağlar convert_attribute() - Literal değerleri ekler Ontoloji tanımlarından tam URI'leri alır

  5. Güncellenmiş Ana İşlemci (extract.py) Eski üçlü tabanlı çıkarma kodunu kaldırdı extract_with_simplified_format() yöntemini ekledi Artık yalnızca yeni, basitleştirilmiş formatı kullanır İstemleri extract-with-ontologies-v2 kimliğiyle çağırır

Test Senaryoları

Test 1: URI Korunması

# Given ontology class
classes = {"fo/Recipe": {"uri": "http://purl.org/ontology/fo/Recipe", ...}}

# When LLM returns
llm_output = {"subject": "x", "predicate": "rdf:type", "object": "fo/Recipe"}

# Then expanded URI should be
assert expanded == "http://purl.org/ontology/fo/Recipe"
# Not: "https://trustgraph.ai/ontology/food#Recipe"

Test 2: Çoklu Ontoloji Çakışması

# Given two ontologies
ont1 = {"fo/Recipe": {...}}
ont2 = {"cooking/Recipe": {...}}

# LLM should use full prefix to disambiguate
llm_output = {"object": "fo/Recipe"}  # Not just "Recipe"

Test 3: Varlık Örneği Formatı

# Given prompt with food ontology
# LLM should create instances like
{"subject": "recipe:cornish-pasty"}  # Namespace-style
{"subject": "food:beef"}              # Consistent prefix

ık Sorular

  1. Varlık örnekleri namespace önekleri kullanmalı mı? Mevcut durum: "recipe:cornish-pasty" (keyfi) Alternatif: Ontoloji önekini kullanın "fo:cornish-pasty"? Alternatif: Önek yok, URI'da genişletin "cornish-pasty" → tam URI?

  2. Alan/kapsam (domain/range) nasıl işlenmeli? Şu anda gösterilen: (Recipe → Food) Şu şekilde olmalı mı: (fo/Recipe → fo/Food)?

  3. Alan/kapsam kısıtlamalarını doğrulamalı mıyız? TODO yorumu extract.py:470 satırında Daha fazla hata yakalanır, ancak daha karmaşık olur

  4. Ters özellikler ve eşdeğerlikler hakkında ne düşünülmeli? Ontolojide owl:inverseOf, owl:equivalentClass bulunmaktadır Şu anda çıkarımda kullanılmıyor Kullanılmalı mı?

Başarı Metrikleri

Sıfır URI bilgisi kaybı (orijinal URI'lerin %100 korunması) LLM çıktısı formatı, giriş formatıyla eşleşiyor Girişte belirsiz örnek yok Birden fazla ontolojiyle testler geçiliyor İyileştirilmiş çıkarım kalitesi (geçerli üçlü yüzdesi ile ölçülür)

Alternatif Yaklaşım: Basitleştirilmiş Çıkarım Formatı

Felsefe

LLM'den RDF/OWL semantiğini anlamasını istemek yerine, LLM'nin iyi olduğu şeyi yapmasını isteyin: metindeki varlıkları ve ilişkileri bulun.

URI oluşturma, RDF'ye dönüştürme ve semantik web formalitelerini kodun halletmesine izin verin.

Örnek: Varlık Sınıflandırması

Giriş Metni:

Cornish pasty is a traditional British pastry filled with meat and vegetables.

Ontoloji Şeması (LLM'ye gösterilen):

## Entity Types:
- Recipe: A recipe is a combination of ingredients and a method
- Food: A food is something that can be eaten
- Ingredient: An ingredient combines a quantity and a food

LLM'nin Döndürdükleri (Basit JSON):

{
  "entities": [
    {
      "entity": "Cornish pasty",
      "type": "Recipe"
    }
  ]
}

Kodun Ürettiği Şeyler (RDF Üçlüleri):

# 1. Normalize entity name + type to ID (type prevents collisions)
entity_id = "recipe-cornish-pasty"  # normalize("Cornish pasty", "Recipe")
entity_uri = "https://trustgraph.ai/food/recipe-cornish-pasty"

# Note: Same name, different type = different URI
# "Cornish pasty" (Recipe) → recipe-cornish-pasty
# "Cornish pasty" (Food) → food-cornish-pasty

# 2. Generate triples
triples = [
    # Type triple
    Triple(
        s=Value(value=entity_uri, is_uri=True),
        p=Value(value="http://www.w3.org/1999/02/22-rdf-syntax-ns#type", is_uri=True),
        o=Value(value="http://purl.org/ontology/fo/Recipe", is_uri=True)
    ),
    # Label triple (automatic)
    Triple(
        s=Value(value=entity_uri, is_uri=True),
        p=Value(value="http://www.w3.org/2000/01/rdf-schema#label", is_uri=True),
        o=Value(value="Cornish pasty", is_uri=False)
    )
]

Faydalar

  1. LLM'nin (Büyük Dil Modeli) yapması gerekmiyor: URI sözdizimini anlamak Tanımlayıcı önekleri oluşturmak (recipe:, ingredient:) rdf:type veya rdfs:label hakkında bilgi sahibi olmak Semantik web tanımlayıcıları oluşturmak

  2. LLM'nin sadece yapması gerekiyor: Metindeki varlıkları bulmak Bunları ontoloji sınıflarına eşlemek İlişkileri ve özellikleri çıkarmak

  3. Kod şunları yönetir: URI normalizasyonu ve oluşturulması RDF üçlü üretimi Otomatik etiket ataması İsim alanı yönetimi

Neden Bu Daha İyi Çalışıyor

Daha basit istem = daha az kafa karışıklığı = daha az hata Tutarlı kimlikler = kod, normalizasyon kurallarını kontrol eder Otomatik olarak oluşturulan etiketler = eksik rdfs:label üçlüleri yok LLM, çıkarma üzerine odaklanır = aslında iyi olduğu şey

Örnek: Varlık İlişkileri

Giriş Metni:

Cornish pasty is a traditional British pastry filled with beef and potatoes.

Ontoloji Şeması (LLM'ye gösterilen):

## Entity Types:
- Recipe: A recipe is a combination of ingredients and a method
- Food: A food is something that can be eaten
- Ingredient: An ingredient combines a quantity and a food

## Relationships:
- has_ingredient: Relates a recipe to an ingredient it uses (Recipe → Ingredient)
- food: Relates an ingredient to the food that is required (Ingredient → Food)

LLM'nin Döndürdükleri (Basit JSON):

{
  "entities": [
    {
      "entity": "Cornish pasty",
      "type": "Recipe"
    },
    {
      "entity": "beef",
      "type": "Food"
    },
    {
      "entity": "potatoes",
      "type": "Food"
    }
  ],
  "relationships": [
    {
      "subject": "Cornish pasty",
      "subject-type": "Recipe",
      "relation": "has_ingredient",
      "object": "beef",
      "object-type": "Food"
    },
    {
      "subject": "Cornish pasty",
      "subject-type": "Recipe",
      "relation": "has_ingredient",
      "object": "potatoes",
      "object-type": "Food"
    }
  ]
}

Kodun Ürettiği Şeyler (RDF Üçlüleri):

# Normalize entity names to URIs
cornish_pasty_uri = "https://trustgraph.ai/food/cornish-pasty"
beef_uri = "https://trustgraph.ai/food/beef"
potatoes_uri = "https://trustgraph.ai/food/potatoes"

# Look up relation URI from ontology
has_ingredient_uri = "http://purl.org/ontology/fo/ingredients"  # from fo/has_ingredient

triples = [
    # Entity type triples (as before)
    Triple(s=cornish_pasty_uri, p=rdf_type, o="http://purl.org/ontology/fo/Recipe"),
    Triple(s=cornish_pasty_uri, p=rdfs_label, o="Cornish pasty"),

    Triple(s=beef_uri, p=rdf_type, o="http://purl.org/ontology/fo/Food"),
    Triple(s=beef_uri, p=rdfs_label, o="beef"),

    Triple(s=potatoes_uri, p=rdf_type, o="http://purl.org/ontology/fo/Food"),
    Triple(s=potatoes_uri, p=rdfs_label, o="potatoes"),

    # Relationship triples
    Triple(
        s=Value(value=cornish_pasty_uri, is_uri=True),
        p=Value(value=has_ingredient_uri, is_uri=True),
        o=Value(value=beef_uri, is_uri=True)
    ),
    Triple(
        s=Value(value=cornish_pasty_uri, is_uri=True),
        p=Value(value=has_ingredient_uri, is_uri=True),
        o=Value(value=potatoes_uri, is_uri=True)
    )
]

Önemli Noktalar: LLM, doğal dil varlık isimlerini döndürür: "Cornish pasty", "beef", "potatoes" LLM, anlam belirsizliğini gidermek için türleri içerir: subject-type, object-type LLM, şemadan ilişki adını kullanır: "has_ingredient" Kod, (isim, tür) kullanarak tutarlı kimlikler türetir: ("Cornish pasty", "Recipe")recipe-cornish-pasty Kod, ontolojiden ilişki URI'sini arar: fo/has_ingredient → tam URI Aynı (isim, tür) ikilisi her zaman aynı URI'yi alır (çiftleme önleme)

Örnek: Varlık İsimlerinin Anlam Belirsizliğinin Giderilmesi

Sorun: Aynı isim, farklı varlık türlerini ifade edebilir.

Gerçek dünya örneği:

"Cornish pasty" can be:
- A Recipe (instructions for making it)
- A Food (the dish itself)

Nasıl İşlendiği:

LLM, her ikisini de ayrı varlıklar olarak döndürür:

{
  "entities": [
    {"entity": "Cornish pasty", "type": "Recipe"},
    {"entity": "Cornish pasty", "type": "Food"}
  ],
  "relationships": [
    {
      "subject": "Cornish pasty",
      "subject-type": "Recipe",
      "relation": "produces",
      "object": "Cornish pasty",
      "object-type": "Food"
    }
  ]
}

Kod Çözümleme:

# Different types → different URIs
recipe_uri = normalize("Cornish pasty", "Recipe")
# → "https://trustgraph.ai/food/recipe-cornish-pasty"

food_uri = normalize("Cornish pasty", "Food")
# → "https://trustgraph.ai/food/food-cornish-pasty"

# Relationship connects them correctly
triple = Triple(
    s=recipe_uri,  # The Recipe
    p="http://purl.org/ontology/fo/produces",
    o=food_uri     # The Food
)

Neden İşe Yarıyor: Tip, TÜM referanslarda (varlıklar, ilişkiler, özellikler) bulunur. Kod, arama anahtarı olarak (name, type) tuple'ını kullanır. Herhangi bir belirsizlik, herhangi bir çakışma yoktur.

Örnek: Varlık Özellikleri

Giriş Metni:

This Cornish pasty recipe serves 4-6 people and takes 45 minutes to prepare.

Ontoloji Şeması (LLM'ye gösterilen):

## Entity Types:
- Recipe: A recipe is a combination of ingredients and a method

## Attributes:
- serves: Indicates what the recipe is intended to serve (Recipe → text)
- preparation_time: Time needed to prepare the recipe (Recipe → text)

LLM'nin Döndürdükleri (Basit JSON):

{
  "entities": [
    {
      "entity": "Cornish pasty recipe",
      "type": "Recipe"
    }
  ],
  "attributes": [
    {
      "entity": "Cornish pasty recipe",
      "entity-type": "Recipe",
      "attribute": "serves",
      "value": "4-6 people"
    },
    {
      "entity": "Cornish pasty recipe",
      "entity-type": "Recipe",
      "attribute": "preparation_time",
      "value": "45 minutes"
    }
  ]
}

Kodun Ürettiği Şeyler (RDF Üçlüleri):

# Normalize entity name to URI
recipe_uri = "https://trustgraph.ai/food/cornish-pasty-recipe"

# Look up attribute URIs from ontology
serves_uri = "http://purl.org/ontology/fo/serves"  # from fo/serves
prep_time_uri = "http://purl.org/ontology/fo/preparation_time"  # from fo/preparation_time

triples = [
    # Entity type triple
    Triple(
        s=Value(value=recipe_uri, is_uri=True),
        p=Value(value=rdf_type, is_uri=True),
        o=Value(value="http://purl.org/ontology/fo/Recipe", is_uri=True)
    ),

    # Label triple (automatic)
    Triple(
        s=Value(value=recipe_uri, is_uri=True),
        p=Value(value=rdfs_label, is_uri=True),
        o=Value(value="Cornish pasty recipe", is_uri=False)
    ),

    # Attribute triples (objects are literals, not URIs)
    Triple(
        s=Value(value=recipe_uri, is_uri=True),
        p=Value(value=serves_uri, is_uri=True),
        o=Value(value="4-6 people", is_uri=False)  # Literal value!
    ),
    Triple(
        s=Value(value=recipe_uri, is_uri=True),
        p=Value(value=prep_time_uri, is_uri=True),
        o=Value(value="45 minutes", is_uri=False)  # Literal value!
    )
]

Önemli Noktalar: LLM, gerçek değerleri çıkarır: "4-6 people", "45 minutes" LLM, anlam ayrımı için varlık türünü içerir: entity-type LLM, şemadan öznitelik adını kullanır: "serves", "preparation_time" Kod, öznitelik URI'sini ontoloji veri türü özelliklerinden arar Nesne bir literaldir (is_uri=False), bir URI referansı değildir Değerler, doğal metin olarak kalır, normalleştirmeye gerek yoktur

İlişkilerden Farkı: İlişkiler: hem konu hem de nesne varlıklardır (URI'ler) Öznitelikler: konu bir varlıktır (URI), nesne bir literal değerdir (dize/sayı)

Tam Örnek: Varlıklar + İlişkiler + Öznitelikler

Giriş Metni:

Cornish pasty is a savory pastry filled with beef and potatoes.
This recipe serves 4 people.

LLM'nin Döndürdükleri:

{
  "entities": [
    {
      "entity": "Cornish pasty",
      "type": "Recipe"
    },
    {
      "entity": "beef",
      "type": "Food"
    },
    {
      "entity": "potatoes",
      "type": "Food"
    }
  ],
  "relationships": [
    {
      "subject": "Cornish pasty",
      "subject-type": "Recipe",
      "relation": "has_ingredient",
      "object": "beef",
      "object-type": "Food"
    },
    {
      "subject": "Cornish pasty",
      "subject-type": "Recipe",
      "relation": "has_ingredient",
      "object": "potatoes",
      "object-type": "Food"
    }
  ],
  "attributes": [
    {
      "entity": "Cornish pasty",
      "entity-type": "Recipe",
      "attribute": "serves",
      "value": "4 people"
    }
  ]
}

Sonuç: 11 RDF üçlüsü oluşturuldu: 3 varlık türü üçlüsü (rdf:type) 3 varlık etiket üçlüsü (rdfs:label) - otomatik 2 ilişki üçlüsü (has_ingredient) 1 özellik üçlüsü (serves)

Bunların hepsi, LLM tarafından yapılan basit, doğal dil çıkarımlarından elde edilmiştir!

Referanslar

Mevcut uygulama: trustgraph-flow/trustgraph/extract/kg/ontology/extract.py İstek şablonu: ontology-prompt.md Test senaryoları: tests/unit/test_extract/test_ontology/ Örnek ontoloji: e2e/test-data/food.ontology