OData 元数据和 URI

OData metadata and URIs

首先,我要说的是,这与我的专业领域相去甚远。我正在从 public OData 提要中将这些数据提取到 Excel Power Query 中,下面是元数据 url:

https://safetydata.fra.dot.gov/MasterWebService/PublicApi/frads/v1/odata/gcis/$metadata

当我请求一个数据集时,它 return 是一个与上面元数据中定义的每个属性的“交叉”(不能 post 一个 link 到一个数据集,因为它需要一个令牌),但下面基本上是 returned.

<ArrayOfCrossing>
<Crossing>
<Property></Property>
</Crossing>
</ArrayOfCrossing>

我迷路的地方是我如何深入研究该元数据和 return 每个 属性 的元数据。例如,属性 'CntyCD'(县)return 是指县的代码。我想要县名而不是代码。

我尝试过的:

除了形成基本查询外,API 网站上没有太多文档。

如果有人可以查看此元数据 url 并帮助我理解元数据的“形状”或指出任何资源,我将不胜感激。

对于后来发现此问题的任何人,答案是您无法从中获取任何其他元数据。您必须从他们网站上的各种来源构建自己的查找 table。

我对这个解决方案的来源是管理数据源(联邦铁路管理局)的人,他们向我指出了这个 URL:https://safetydata.fra.dot.gov/OfficeofSafety/publicsite/DownloadCrossingInventoryData.aspx

以上 url 包含 CSV 格式的各种查找 table,标题为“参考数据和文档”,以及解释每个字段编码的 pdf。据我所知,大多数字段的值都列在一个或多个可下载文件中。

这不是我希望的解决方案,但它确实有效。我希望从查询中获取值,而不是通过维护我自己的 table 数据,这些数据需要在他们对查找进行任何更改时进行更新。

OData 很棒,$metadata 是一种丰富的描述性语言,允许 API 开发人员表达架构的结构边界。一个定义良好的服务 $metadata 你应该能够描述最有效的输入和输出表达式。相关 属性 的元数据是这样的:

<Property Name="CntyCD" Type="Edm.String" frads:DisplayName="County"/>

不幸的是,由于此 属性 被描述为没有验证或其他约束的 String,并且 $ 元数据中没有关于此 属性 的进一步注释,因此使用这些标准无法找到更多信息,仅仅是因为它们的架构设计不当,无法让您获得任何更多信息。

So this isn't a deficiency in the OData Protocol itself, just a deficiency in the specific API that you are querying.

指定一个 属性 依赖于特定值列表的常用方法是包含导航 属性,或者至少指定 属性 returns 一个复杂类型的集合或实例。如果我们查看 TripPinService,您可以看到此类信息:

<EntityType Name="Person">
  <Key>
    <PropertyRef Name="UserName"/>
  </Key>
  <Property Name="UserName" Type="Edm.String" Nullable="false"/>
  <Property Name="FirstName" Type="Edm.String" Nullable="false"/>
  <Property Name="LastName" Type="Edm.String" MaxLength="26"/>
  <Property Name="MiddleName" Type="Edm.String"/>
  <Property Name="Gender" Type="Trippin.PersonGender" Nullable="false"/>
  <Property Name="Age" Type="Edm.Int64"/>
  <Property Name="Emails" Type="Collection(Edm.String)"/>
  <Property Name="AddressInfo" Type="Collection(Trippin.Location)"/>
  <Property Name="HomeAddress" Type="Trippin.Location"/>
  <Property Name="FavoriteFeature" Type="Trippin.Feature" Nullable="false"/>
  <Property Name="Features" Type="Collection(Trippin.Feature)" Nullable="false"/>
  <NavigationProperty Name="Friends" Type="Collection(Trippin.Person)"/>
  <NavigationProperty Name="BestFriend" Type="Trippin.Person"/>
  <NavigationProperty Name="Trips" Type="Collection(Trippin.Trip)"/>
</EntityType>

然而即便如此,特定的验证规则也会变得更加与数据相关,即使结构是正确的。我们只能通过从某个地方查询来检查数据值。对于 TripPin,它确实提供了端点来查找必要的信息。

If there was a finite list of possible static values, then this should be defined in the $metadata as an Enum, an example again from TripTip where there is a PersonGender enum defined:

<EnumType Name="PersonGender">
  <Member Name="Male" Value="0"/>
  <Member Name="Female" Value="1"/>
  <Member Name="Unknown" Value="2"/>
</EnumType>

因为这是关于 数据 而不是 模式 的问题。并且此 API 不提供 return 可能的 CntyCD 值的端点,那么一种选择是从 table 中查询 CntyCD 的唯一值:

https://safetydata.fra.dot.gov/MasterWebService/PublicApi/frads/v1/odata/gcis/Crossings?$apply=groupby((CntyCD))

注意: 此结果集不能保证是 ALL 可能值的有限列表,但它可能足以满足您的需求。

在处理 public 或政府 API 时,当数据结构 假定 您必须已经 知道 关于数据的某些方面,那么他们很可能已经在单独的位置发布了该数据列表。

一个好的起点是转到 API 的 URL 的主机或根目录,看看是否有任何文档作为 html 或其他一些可浏览的形式.在这种情况下 https://safetydata.fra.dot.gov does provide a listing and in the menu you can see they have Downloads and in that list is FRA Auxiliary Tables

如果该信息不可用,那么任何地区的当地邮政服务通常都是开始寻找位置人口统计信息的好地方。