Rowlex - Получение только «корневых» людей документа

StackOverflow https://stackoverflow.com/questions/7312848

  •  26-10-2019
  •  | 
  •  

Вопрос

Вот мой документ 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>

И я пытаюсь получить особей узла 1 и узла 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 без их подложений в списке? (Курсов, идентификаторы отдельных лиц динамически генерируются, поэтому я не могу искать конкретный идентификатор)

Спасибо.

Это было полезно?

Решение

Я считаю, что здесь есть некоторое недоразумение относительно 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 Serializer, вероятно, выберет первый в ряду, чтобы быть «корнем», а другой - как «субэлемент», но он произвольный. Гнездование - это просто иллюзия, созданная сериализацией XML. Не поддавайтесь на это.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top