0

这是我的 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 而没有列表中的子元素?(当然,个人 ID 是动态生成的,因此我无法搜索特定 ID)

谢谢。

4

1 回答 1

0

我相信这里对 RDF 和 XML 有一些误解。RDF 是一组可以用 XML 和其他序列化格式表示的三元组。与 XML 不同,RDF 不是分层的,因此 RDF 中没有“子元素”这样的东西。Guid 先生位于 Node_1 先生之下的事实是误导性 XML 节点层次结构“暗示”的一种错觉。为了证明这一点,我列出了您的示例的三元组(请注意,RDF 中三元组的顺序无关紧要!):

"Node 1" typeOf Person
"Node 1" description "Default.png"
"Node 1" description "Description"
"Node 1" 知道 "Mr. Guid"
"Mr. Guid" typeOf Person
"Node 2" typeOf Person
"Node 2 " 描述 "Default.png"
"节点 2" 描述 "描述"

请尝试以下操作:再添加一个三元组:“Mr. Guid”通过以下代码知道“节点 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 都知道 Guid 先生,Guid 先生也知道节点 1,这是一个完全合法的场景。谁是根,谁是子元素?XML 序列化程序可能会选择行中的第一个作为“根”,另一个作为“子元素”,但它是任意的。嵌套只是 XML 序列化造成的一种错觉。不要为此而堕落。

您使用该rdfDocument.GetIndividuals(Person.Uri, true);语句触发的查询只是过滤掉所有类型为 的个人,Person因此它正确返回所有三个人。

于 2011-09-06T17:08:24.250 回答