RDF/XML 中的动态数组

Dynamic Array in RDF/XML

在 c# 中,我正在生成一个图形并使用 RDF/XML 将其发送到我的 android 应用程序。我的图表的一部分应该显示到达某个火车站的不同火车。 添加一列火车,它的到达、出发、目的地等都没有问题。不幸的是,我不知道如何在 RDF/XML.

中找到不同火车经过的所有车站

例如:

我如何动态地添加数组,如 [city 5, city 6, city 7] 到火车?

我现在的 RDF/XML:

    <?xml version="1.0" encoding="utf-16"?>" +
                "<!DOCTYPE rdf:RDF [\n" +
                "\t<!ENTITY rdf 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'>\n" +
                "]>\n" +
                "<rdf:RDF xmlns:rdfs=\"http://www.w3.org/2000/01/rdf-schema#\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema#\" xmlns:ns0=\"http://my.url.com/ontologies/mash-up#\" xmlns:ns1=\"http://xmlns.com/foaf/0.1/\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n" +
                "  <ns0:Train rdf:about=\"http://my.url.com/ontologies/mash-up#Train-1d4b674c-479c-48a3-aab3-b729fc96cbd4\">\n" +
                "    <ns0:name rdf:datatype=\"&xsd;string\">RE 1</ns0:name>\n" +
                "    <ns0:description rdf:datatype=\"&xsd;string\">Platform 1</ns0:description>\n" +
                "    <ns0:arrival rdf:datatype=\"&xsd;dateTime\">2015-04-14T18:00:40Z</ns0:arrival>\n" +
                "    <ns0:departure rdf:datatype=\"&xsd;dateTime\">2015-04-14T18:02:40Z</ns0:departure>\n" +
                "    <ns0:destination rdf:datatype=\"&xsd;string\">Padaborn</ns0:destination>\n" +
                "    <ns1:primaryTopic rdf:resource=\"http://my.url.com/ontologies/mash-up#Train-1d4b674c-479c-48a3-aab3-b729fc96cbd4\" />\n" +
                "  </ns0:Train>\n" +
                "</rdf:RDF>";

简单地将所有站点添加为自己的属性意味着我的 Jena 查询必须有非常非常多的选项,我想避免这种情况。

提前致谢。

编辑: 我就是这样做的。那将意味着很多选项...

" <ns0:stations rdf:about=\"http://my.url.com/ontologies/mash-up#Stations-xxxx\">“+
"   <ns0:from rdf:datatype=\"&xsd;string\">Aachen</ns0:from>\n“ +
"   <ns0:to rdf:datatype=\"&xsd;string\">Padaborn</ns0:to>\n“ +
"   <ns0:over1 rdf:datatype=\"&xsd;string\“>Köln</ns0:to>\n“ +
"   <ns0:over2 rdf:datatype=\"&xsd;string\“>Düsseldorf</ns0:to>\n“ +
"   <ns0:over3 rdf:datatype=\"&xsd;string\“>Duisburg</ns0:to>\n“ +
"   <ns0:over4 rdf:datatype=\"&xsd;string\“>Essen</ns0:to>\n“ +
"   <ns0:over5 rdf:datatype=\"&xsd;string\“>Dortmund</ns0:to>\n“ +
"   <ns0:over6 rdf:datatype=\"&xsd;string\“>Hamm (Westf)</ns0:to>\n“ +
" </ns0:stations>\n"

如果站的顺序重要:

最简单的选择,如果通过的站点顺序重要,将使用相同 属性.这在数据中看起来像这样(我将使用 Turtle,因为它更易读和可写,但也显示相应的 RDF/XML;两者之间的转换很容易,因为它们只是不同的序列化相同的数据):

@prefix : <urn:train:>.
@prefix xsd: <http://www.w3.org/2001/XMLSchema#>.

:train1
  :name "RE 1" ;
  :description "Platform 1" ;
  :arrival "2015-04-14T18:00:40Z"^^xsd:dateTime ;
  :departure "2015-04-14T18:02:40Z"^^xsd:dateTime ;
  :over "Station1", "Station2", "Station3" ;
  :destination "Padaborn" .
<rdf:RDF
    xmlns="urn:train:"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#">
  <rdf:Description rdf:about="urn:train:train1">
    <name>RE 1</name>
    <description>Platform 1</description>
    <arrival rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime"
    >2015-04-14T18:00:40Z</arrival>
    <departure rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime"
    >2015-04-14T18:02:40Z</departure>
    <over>Station1</over>
    <over>Station2</over>
    <over>Station3</over>
    <destination>Padaborn</destination>
  </rdf:Description>
</rdf:RDF>

然后你可以在 SPARQL 查询中只使用 一个 可选:

prefix : <urn:train:>
prefix xsd: <http://www.w3.org/2001/XMLSchema#>

select * where {
  ?train :name ?name ;
         :description ?description ;
         :arrival ?arrival ;
         :departure ?departure ;
         :destination ?destination .
  optional {
    ?train :over ?over
  }
}
--------------------------------------------------------------------------------------------------------------------------------------------
| train   | name   | description  | arrival                              | departure                            | destination | over       |
============================================================================================================================================
| :train1 | "RE 1" | "Platform 1" | "2015-04-14T18:00:40Z"^^xsd:dateTime | "2015-04-14T18:02:40Z"^^xsd:dateTime | "Padaborn"  | "Station3" |
| :train1 | "RE 1" | "Platform 1" | "2015-04-14T18:00:40Z"^^xsd:dateTime | "2015-04-14T18:02:40Z"^^xsd:dateTime | "Padaborn"  | "Station2" |
| :train1 | "RE 1" | "Platform 1" | "2015-04-14T18:00:40Z"^^xsd:dateTime | "2015-04-14T18:02:40Z"^^xsd:dateTime | "Padaborn"  | "Station1" |
--------------------------------------------------------------------------------------------------------------------------------------------

您可能需要列表中的那些,因此您可以 group_concat 它们的值分组:

prefix : <urn:train:>
prefix xsd: <http://www.w3.org/2001/XMLSchema#>

select ?train ?name ?description
       ?arrival ?departure
       ?destination
       (group_concat(?over) as ?overs)
where {
  ?train :name ?name ;
         :description ?description ;
         :arrival ?arrival ;
         :departure ?departure ;
         :destination ?destination .
  optional {
    ?train :over ?over
  }
}
group by ?train ?name ?description ?arrival ?departure ?destination
--------------------------------------------------------------------------------------------------------------------------------------------------------------
| train   | name   | description  | arrival                              | departure                            | destination | overs                        |
==============================================================================================================================================================
| :train1 | "RE 1" | "Platform 1" | "2015-04-14T18:00:40Z"^^xsd:dateTime | "2015-04-14T18:02:40Z"^^xsd:dateTime | "Padaborn"  | "Station3 Station2 Station1" |
--------------------------------------------------------------------------------------------------------------------------------------------------------------

如果顺序很重要

如果顺序更重要,那么您需要以某种方式保留它。您可以使用不同的属性或具有列表值的 属性(或支持排序的其他一些结构化数据)来执行此操作。

具有多个属性

您使用 over1、over2、over3 属性的解决方案实际上可以仅使用一个可选模式来实现,因为您可以使用变量代替 属性,然后过滤该值.只需检查它的 URI 是否以正确的前缀开头,including over:

@prefix : <urn:train:>.
@prefix xsd: <http://www.w3.org/2001/XMLSchema#>.

:train1
  :name "RE 1" ;
  :description "Platform 1" ;
  :arrival "2015-04-14T18:00:40Z"^^xsd:dateTime ;
  :departure "2015-04-14T18:02:40Z"^^xsd:dateTime ;
  :over1 "Station1" ;
  :over2 "Station2" ;
  :over3 "Station3" ;
  :destination "Padaborn" .
<rdf:RDF
    xmlns="urn:train:"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#">
  <rdf:Description rdf:about="urn:train:train1">
    <name>RE 1</name>
    <description>Platform 1</description>
    <arrival rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime"
    >2015-04-14T18:00:40Z</arrival>
    <departure rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime"
    >2015-04-14T18:02:40Z</departure>
    <over1>Station1</over1>
    <over2>Station2</over2>
    <over3>Station3</over3>
    <destination>Padaborn</destination>
  </rdf:Description>
</rdf:RDF>
prefix : <urn:train:>
prefix xsd: <http://www.w3.org/2001/XMLSchema#>

select * where {
  ?train :name ?name ;
         :description ?description ;
         :arrival ?arrival ;
         :departure ?departure ;
         :destination ?destination .
  optional {
    ?train ?overProp ?over .
    filter strstarts(str(?overProp),str(:over))
  }
}
order by ?overProp
-------------------------------------------------------------------------------------------------------------------------------------------------------
| train   | name   | description  | arrival                              | departure                            | destination | overProp | over       |
=======================================================================================================================================================
| :train1 | "RE 1" | "Platform 1" | "2015-04-14T18:00:40Z"^^xsd:dateTime | "2015-04-14T18:02:40Z"^^xsd:dateTime | "Padaborn"  | :over1   | "Station1" |
| :train1 | "RE 1" | "Platform 1" | "2015-04-14T18:00:40Z"^^xsd:dateTime | "2015-04-14T18:02:40Z"^^xsd:dateTime | "Padaborn"  | :over2   | "Station2" |
| :train1 | "RE 1" | "Platform 1" | "2015-04-14T18:00:40Z"^^xsd:dateTime | "2015-04-14T18:02:40Z"^^xsd:dateTime | "Padaborn"  | :over3   | "Station3" |
-------------------------------------------------------------------------------------------------------------------------------------------------------

当然,您可以使用group by以相同的方式组合此处的值。

只需要一点结构

您也可以只使用一个 属性,但值要有一点结构。例如,一个空白节点,它有一个站值和它在其中传递的索引:

@prefix : <urn:train:>.
@prefix xsd: <http://www.w3.org/2001/XMLSchema#>.

:train1
  :name "RE 1" ;
  :description "Platform 1" ;
  :arrival "2015-04-14T18:00:40Z"^^xsd:dateTime ;
  :departure "2015-04-14T18:02:40Z"^^xsd:dateTime ;
  :over [:station "Station1" ; :number 2 ] ,
        [:station "Station2" ; :number 3 ] ,
        [:station "Station3" ; :number 1 ] ;
  :destination "Padaborn" .
<rdf:RDF
    xmlns="urn:train:"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#">
  <rdf:Description rdf:about="urn:train:train1">
    <name>RE 1</name>
    <description>Platform 1</description>
    <arrival rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime"
    >2015-04-14T18:00:40Z</arrival>
    <departure rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime"
    >2015-04-14T18:02:40Z</departure>
    <over rdf:parseType="Resource">
      <station>Station1</station>
      <number rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
      >2</number>
    </over>
    <over rdf:parseType="Resource">
      <station>Station2</station>
      <number rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
      >3</number>
    </over>
    <over rdf:parseType="Resource">
      <station>Station3</station>
      <number rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
      >1</number>
    </over>
    <destination>Padaborn</destination>
  </rdf:Description>
</rdf:RDF>
prefix : <urn:train:>
prefix xsd: <http://www.w3.org/2001/XMLSchema#>
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

select * where {
  ?train :name ?name ;
         :description ?description ;
         :arrival ?arrival ;
         :departure ?departure ;
         :destination ?destination .
  optional {
    ?train :over [ :station ?over ;
                   :number ?number ]
  }
}
-----------------------------------------------------------------------------------------------------------------------------------------------------
| train   | name   | description  | arrival                              | departure                            | destination | over       | number |
=====================================================================================================================================================
| :train1 | "RE 1" | "Platform 1" | "2015-04-14T18:00:40Z"^^xsd:dateTime | "2015-04-14T18:02:40Z"^^xsd:dateTime | "Padaborn"  | "Station3" | 1      |
| :train1 | "RE 1" | "Platform 1" | "2015-04-14T18:00:40Z"^^xsd:dateTime | "2015-04-14T18:02:40Z"^^xsd:dateTime | "Padaborn"  | "Station2" | 3      |
| :train1 | "RE 1" | "Platform 1" | "2015-04-14T18:00:40Z"^^xsd:dateTime | "2015-04-14T18:02:40Z"^^xsd:dateTime | "Padaborn"  | "Station1" | 2      |
-----------------------------------------------------------------------------------------------------------------------------------------------------

有一个属性和一个列表

你也可以有一个 over 属性 并且它的值是一个列表。这在N3/Turtle连载中非常好写。它在 RDF/XML 中没有那么漂亮,但正如我在评论中所说,如果您手写,最好使用人类可写的语法,或者使用适当的 API 来编写它。在 SPARQL 中查询也不难。

@prefix : <urn:train:>.
@prefix xsd: <http://www.w3.org/2001/XMLSchema#>.

:train1
  :name "RE 1" ;
  :description "Platform 1" ;
  :arrival "2015-04-14T18:00:40Z"^^xsd:dateTime ;
  :departure "2015-04-14T18:02:40Z"^^xsd:dateTime ;
  :over ("Station1" "Station2" "Station3") ;
  :destination "Padaborn" .
<rdf:RDF
    xmlns="urn:train:"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#">
  <rdf:Description rdf:about="urn:train:train1">
    <name>RE 1</name>
    <description>Platform 1</description>
    <arrival rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime"
    >2015-04-14T18:00:40Z</arrival>
    <departure rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime"
    >2015-04-14T18:02:40Z</departure>
    <over rdf:parseType="Resource">
      <rdf:first>Station1</rdf:first>
      <rdf:rest rdf:parseType="Resource">
        <rdf:first>Station2</rdf:first>
        <rdf:rest rdf:parseType="Resource">
          <rdf:first>Station3</rdf:first>
          <rdf:rest rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#nil"/>
        </rdf:rest>
      </rdf:rest>
    </over>
    <destination>Padaborn</destination>
  </rdf:Description>
</rdf:RDF>
prefix : <urn:train:>
prefix xsd: <http://www.w3.org/2001/XMLSchema#>
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

select * where {
  ?train :name ?name ;
         :description ?description ;
         :arrival ?arrival ;
         :departure ?departure ;
         :destination ?destination .
  optional {
    ?train :over/(rdf:rest*/rdf:first) ?over
  }
}
--------------------------------------------------------------------------------------------------------------------------------------------
| train   | name   | description  | arrival                              | departure                            | destination | over       |
============================================================================================================================================
| :train1 | "RE 1" | "Platform 1" | "2015-04-14T18:00:40Z"^^xsd:dateTime | "2015-04-14T18:02:40Z"^^xsd:dateTime | "Padaborn"  | "Station1" |
| :train1 | "RE 1" | "Platform 1" | "2015-04-14T18:00:40Z"^^xsd:dateTime | "2015-04-14T18:02:40Z"^^xsd:dateTime | "Padaborn"  | "Station2" |
| :train1 | "RE 1" | "Platform 1" | "2015-04-14T18:00:40Z"^^xsd:dateTime | "2015-04-14T18:02:40Z"^^xsd:dateTime | "Padaborn"  | "Station3" |
--------------------------------------------------------------------------------------------------------------------------------------------

当然,您也可以在此处group_concat 分组。使用基于列表的方法,您实际上也可以计算元素在列表中的位置。参见,例如,我对 Is it possible to get the position of an element in an RDF Collection in SPARQL?.

的回答