语义Web-rdf-Workers的项目和公司使用的计算机按年



我想用公司的员工做一个芝麻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>

您需要远离语法,思考概念模型。在您的模型中,您有员工、项目、公司和部门。我建议您在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查询语言非常匹配——一旦你理解了其中一个,另一个就会自然而然地出现)。

最新更新