Rowlex - получение только "корневых" лиц документа

Вот мой документ в формате rdf, сгенерированный библиотекой rowlex:

<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
         xmlns:ns="http://xmlns.com/foaf/0.1/" 
         xmlns:privateinfos="http://domain/privateinfos/"> 

    <ns:Person rdf:about="Node 1">
        <ns:depiction rdf:resource="Default.png" />
        <privateinfos:description rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Description</privateinfos:description>
        <ns:knows>
            <ns:Person rdf:about="6779ac10-210b-40d2-8111-711db6988bb9" />
        </ns:knows> 
    </ns:Person>

    <ns:Person rdf:about="Node 2">
        <ns:depiction rdf:resource="Default.png" />
        <privateinfos:description rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Description 2</privateinfos:description>
    </ns:Person>

</rdf:RDF>

И я пытаюсь получить лиц Node 1 и Node 2 с этим кодом:

List<Person> person_list = new List<Document>();
OwlThing[] Persons = _rdfDocument.GetIndividuals(Person.Uri, true);

foreach (Person item_found in Persons)
{
    person_list.Add(item_found);
}

return person_list;

К сожалению, person_list возвращается со следующими данными:

[0] : Node 1
[1] : 6779ac10-210b-40d2-8111-711db6988bb9
[2] : Node 2

Так есть ли способ / метод, чтобы получить только узлы 1 и 2 без их подэлементов в списке? (конечно, идентификаторы личности генерируются динамически, поэтому я не могу найти конкретный идентификатор)

Благодарю.

1 ответ

Решение

Я считаю, что здесь есть некоторое недопонимание, касающееся RDF и XML. RDF - это набор троек, которые могут быть выражены как в XML, так и в других форматах сериализации. В отличие от XML, RDF не является иерархическим, поэтому в RDF нет такого понятия, как "подэлемент". Тот факт, что мистер Гуид находится под управлением мистера Node_1, является иллюзией, "предложенной" вводящей в заблуждение иерархией узлов XML. Чтобы продемонстрировать это, я перечислю тройки ваших примеров (имейте в виду, что порядок троек в RDF не имеет значения!):

Тип "Узел 1" на человека
"Узел 1" изображение "Default.png"
"Узел 1" описание "Описание"
"Узел 1" знает "Мистер Гуид"
Тип "Мистер Гуид" от лица
Тип "Узел 2" человека
"Узел 2" с описанием "Default.png"
"Узел 2" описание "Описание"

Попробуйте следующее: Добавьте еще одну тройку: "Мистер Гуид" знает "Узел 1" со следующим кодом:

Person mrGuid = _rdfDocument.GetIndividual("6779ac10-210b-40d2-8111-711db6988bb9") as Person;
Person mrNode1 = _rdfDocument.GetIndividual("Node 1") as Person;
mrGuid.knows = mrNode1;
Console.WriteLine(_rdfDocument.ToRdfXml());

Теперь и Узел 1 знает Мистера Гуида, а Мистер Гуид знает Узел 1, и это совершенно законный сценарий. Кто будет корнем, а кто будет субэлементом? Сериализатор XML, вероятно, выберет первый в строке "корень", а другой - "подэлемент", но он произвольный. Вложенность - это иллюзия, созданная сериализацией XML. Не поддавайтесь на это.

Запрос, который вы запускаете с rdfDocument.GetIndividuals(Person.Uri, true); заявление просто отфильтровывает всех людей, которые имеют тип Personи, следовательно, он правильно возвращает всех трех парней.

Другие вопросы по тегам