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
и, следовательно, он правильно возвращает всех трех парней.