1

我想和公司的员工一起做一个芝麻 rdf 数据库。工人在某个日期范围内参与了一些项目。他们也有电脑。所以在数据库之后,我必须能够根据过去或现在某些人或从事某些项目的人使用的计算机来搜索该数据库。所以,我无法决定如何排序工人、公司、项目、计算机的属性,因为我不知道在哪里放置属性年份. 例如,工人过去的公司或过去的项目......我如何将年份放在下面的 rdf 文件中?我认为我没有以适当的方式将年份放在这个文件中。因为应该以某种方式或日期范围定义开始日期和结束日期?之后如何使用 sparql 搜索现在或以前从事特殊项目的人员?还是人们在不同年份使用同一台计算机?

<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:Worker="http://www.semantic.fake/Worker#"
xmlns:Company="http://www.semantic.fake/Company"
xmlns:Project="http://www.semantic.fake/Project">

<rdf:Description
rdf:about="http://www.semantic.fake/Worker/Worker1">
  <Worker:worker_name>Bill Gates</Worker:worker_name>
  <Worker:company_name>Microsoft</Worker:company_name>
  <Worker:department>Software</Worker:department>
  <Worker:task>Co-Founder</Worker:task>
  <Worker:project_name>Windows9</Worker:project_name>
  <Worker:year>2010</Worker:year>

</rdf:Description>

<rdf:Description
rdf:about="http://www.semantic.fake/Worker/Worker2">
  <Worker:worker_name>Steve Jobs</Worker:worker_name>
  <Worker:company_name>Apple</Worker:company_name>
  <Worker:department>Software</Worker:department>
  <Worker:task>Co-Founder</Worker:task>
  <Worker:project_name>Inertial Navigation</Worker:project_name>
  <Worker:year>2008</Worker:year>
  <Worker:computer>LG2</Worker:computer>
</rdf:Description>

<rdf:Description
rdf:about="http://www.semantic.fake/Worker/Worker3">
  <Worker:worker_name>Ozge Akbulut</Worker:worker_name>
  <Worker:company_name>Pozitron</Worker:company_name>
  <Worker:department>Software</Worker:department>
  <Worker:task>Intern</Worker:task>
  <Worker:project_name>Semantic Web</Worker:project_name>
  <Worker:year>2013</Worker:year>
  <Worker:computer>LG1</Worker:computer>
</rdf:Description>

<rdf:Description
rdf:about="http://www.semantic.fake/Company/Company1">
  <Company:company_name>Pozitron</Company:company_name>
  <Company:location>Ayazağa</Company:location>
</rdf:Description>

<rdf:Description
rdf:about="http://www.semantic.fake/Company/Company2">
  <Company:company_name>Garanti Teknoloji</Company:company_name>
  <Company:location>Güneşli</Company:location>
</rdf:Description>

<rdf:Description
rdf:about="http://www.semantic.fake/Company/Company3">
  <Company:company_name>Microsoft</Company:company_name>
  <Company:location>US</Company:location>
</rdf:Description>

<rdf:Description
rdf:about="http://www.semantic.fake/Company/Company4">
  <Company:company_name>Apple</Company:company_name>
  <Company:location>US</Company:location>
</rdf:Description>

<rdf:Description
rdf:about="http://www.semantic.fake/Project/Project1">
  <Project:project_name>BKM Express</Project:project_name>
  <Project:company_name>Pozitron</Project:company_name>
  <Project:year>2013</Project:year>
</rdf:Description>

<rdf:Description
rdf:about="http://www.semantic.fake/Project/Project2">
  <Project:project_name>Iscep</Project:project_name>
  <Project:company_name>Pozitron</Project:company_name>
  <Project:year>2013</Project:year>
</rdf:Description>

<rdf:Description
rdf:about="http://www.semantic.fake/Project/Project3">
  <Project:project_name>Semantic Web</Project:project_name>
  <Project:company_name>Pozitron</Project:company_name>
  <Project:year>2013</Project:year>
</rdf:Description>

<rdf:Description
rdf:about="http://www.semantic.fake/Project/Project4">
  <Project:project_name>Inertial Navigation</Project:project_name>
  <Project:company_name>Apple</Project:company_name>
  <Project:year>2009</Project:year>
</rdf:Description>

<rdf:Description
rdf:about="http://www.semantic.fake/Project/Project5">
  <Project:project_name>Windows9</Project:project_name>
  <Project:company_name>Microsoft</Project:company_name>
  <Project:year>2011</Project:year>
</rdf:Description>


</rdf:RDF>
4

1 回答 1

0

您需要远离语法并考虑概念模型。在您的模型中,您有员工、项目、公司和部门。我建议您将所有这些都表示为 RDF 模型中的类。

ex:Worker a rdfs:Class .
ex:Project a rdfs:Class .
ex:Company a rdfs:Class .
ex:Department a rdf:Class .

(顺便说一句,我对 RDF 使用Turtle语法而不是 RDF/XML,因为它更易于阅读和编辑,并且使数据的实际结构更加清晰。我真的建议您学习并使用它RDF/XML)

但是,您还想谈谈某些人在某些项目/公司/部门的就业情况(例如他们何时开始和何时停止在那里工作)。这意味着您需要将该关系本身表示为一个对象,以便您可以谈论它。例如,要表示一个工人在两个日期之间ex:worker1受雇于公司ex:apple,然后又受雇于公司ex:microsoft,您可以执行以下操作:

ex:worker1 a ex:Worker ;
           ex:name "Steve Jobs"; 
           ex:employment ex:employment1 ; 
           ex:employment ex:employment2 .

ex:employment1 a ex:EmploymentRelation ;
               ex:forCompany ex:apple ;
               ex:startDate "20010101T00:00:00Z"^^xsd:dateTime ;
               ex:endDate "20050101T00:00:00Z"^^xsd:dateTime .

ex:employment2 a ex:EmploymentRelation ;
               ex:forCompany ex:microsoft ;
               ex:startDate "20060101T00:00:00Z"^^xsd:dateTime ;
               ex:endDate "20080101T00:00:00Z"^^xsd:dateTime .

一旦你有如上建模的数据,如果你想做一个 SPARQL 查询,询问所有在两个日期之间为苹果工作的人,你会做这样的事情(作为一个简单的例子):

 SELECT ?worker ?name
 WHERE { ?worker a ex:Worker ;
                 ex:name ?name ;
                 ex:employment [ ex:forCompany ex:apple ;
                                 ex:startDate ?start ;
                                 ex:endDate ?end ] .
         FILTER (?start > "20001231T00:00:00Z"^^xsd:dateTime)
         FILTER (?end < "20120101T00:00:00Z"^^xsd:dateTime
 }

(顺便说一句,上面再次说明了为什么使用 Turtle 是一个好主意:Turtle 语法和 SPARQL 查询语言非常匹配——一旦你理解了一个,另一个自然会跟随)。

于 2013-08-01T01:48:27.880 回答