【问题标题】:path between two resources两个资源之间的路径
【发布时间】:2013-10-25 10:35:53
【问题描述】:

是否可以通过 SPARQL 查询计算连接两个实例的边数?我要找路。

【问题讨论】:

标签: sparql ontology dbpedia


【解决方案1】:

您可以使用 SPARQL 的属性路径和聚合函数计算唯一路径中的边数。例如,对于这样的数据,它包含我们关心的两条路径(ac 有两条边,dg 三边):

@prefix : <https://stackoverflow.com/questions/19587520/sparql-path-between-two-instance/> .

:a :p :b .  # a to c is a path of length 2
:b :p :c .  

:d :p :e .  # d to g is a path of length 3
:e :p :f .
:f :p :g . 

您可以使用如下查询。请注意,我使用了特定属性:p,而不是变量。这是必要的,因为 SPARQL 1.1 规范中的 9.1 Property Path Syntax 不允许在属性路径中使用变量。

prefix : <https://stackoverflow.com/questions/19587520/sparql-path-between-two-instance/>

select ?start ?end (count(?mid) as ?length)
where {
  values (?start ?end) { (:a :c) (:d :g) }
  ?start :p+ ?mid .
  ?mid :p* ?end .
}
group by ?start ?end 

得到这样的结果:

$ sparql --query query.rq --data data.n3
------------------------
| start | end | length |
========================
| :d    | :g  | 3      |
| :a    | :c  | 2      |
------------------------

有关此处发生的事情的更完整描述,请参见:

不过,基本的想法是,如果你有一条从?start?end 的路径,那么对于?mid 的一堆不同值,你还有一条从?start 到的路径?mid 和从?mid?end 的路径。您可以为?mid 选择的不同值的数量(如果您允许其中一个端点,而不允许另一个端点)正是路径的长度。

【讨论】:

  • 是否必须指定属性?我不能这样做吗?--> ?p* 或 ?p+
  • @user2837896 需要指定属性确实。我更新了我对此的回答。不幸的是,property path syntax 不允许使用变量。
  • 我不想指定属性..我想在不指定属性的情况下找到资源之间的最短路径。在java中可以吗?
  • 好吧,无论如何,我认为您无法使用 SPARQL 来实现。如果您在本地拥有数据,您当然可以从资源开始并执行iterative deepening DFSBFS,但是 DBpedia 数据,因此在本地获取它会有点困难。您可以迭代地运行一些查询,但这可能会让您获得太多数据而无法方便地来回发送,并且您可能会遇到 DBpedia 的速率限制。
  • 我想你可以在 SPARQL 中连续尝试越来越长的路径,例如 &lt;x1&gt; ?p &lt;x2&gt;,然后是 &lt;x1&gt; ?p1 [ ?p2 &lt;x2&gt; ],然后是 &lt;x1&gt; ?p1 [ ?p2 [ ?p3 &lt;x2&gt; ]],等等。假设您的路径不是太长,这可能不会花费太多迭代,但它也可能不是一个 cheap 查询,而且可能需要相当长的时间才能完成。现在我也想到你已经指定了你想要有向路径还是无向路径。例如,如果 Bill 和 George 都是 Person 类型,那么 Bill a Person ^a George 是否应该算作一条路径?
猜你喜欢
  • 1970-01-01
  • 2011-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-27
  • 2017-08-10
相关资源
最近更新 更多