Sparql 如何将起始资源中的所有S->P->O三元组返回到指定的路径深度?

Sparql 如何将起始资源中的所有S->P->O三元组返回到指定的路径深度?,sparql,virtuoso,Sparql,Virtuoso,我的目标是以图形方式表示指定资源p:Person_1的两条边深度范围内的S->p->O关系。我希望从查询中返回该路径长度内的所有关系作为?s,?p,?o,以便在图形应用程序中进行进一步处理 我尝试了下面的第一个查询,它给出了我的第一组带重复的s?p?o,然后是p2、o2、p3、o3作为结果中的附加列。我想把p2和p3与p结合,把o2和o3与o结合 然后,基于,我尝试使用CONSTRUCT返回图形 PREFIX p: <http://www.example.org/person/>

我的目标是以图形方式表示指定资源p:Person_1的两条边深度范围内的S->p->O关系。我希望从查询中返回该路径长度内的所有关系作为?s,?p,?o,以便在图形应用程序中进行进一步处理

我尝试了下面的第一个查询,它给出了我的第一组带重复的s?p?o,然后是p2、o2、p3、o3作为结果中的附加列。我想把p2和p3与p结合,把o2和o3与o结合

然后,基于,我尝试使用CONSTRUCT返回图形

PREFIX p: <http://www.example.org/person/> 
PREFIX x: <example.org/foo/>

construct { ?s ?p ?o }
FROM <http://localhost:8890/MYGRAPH>
where { p:Person_1 (x:|!x:)* ?s . 
        ?s ?p ?o . 
}
我可以对第一次查询的结果进行后期处理,但我想学习如何正确地使用SPARQL,最好是使用Virtuoso

测试@AKSW的建议后更新: CONSTRUCT和SELECT语句都使用建议的模式

CONSTRUCT { ?s ?p ?o }
FROM <http://localhost:8890/MYGRAPH>
where { p:Person_1 (x:foo|!x:bar)* ?s . 
        ?s ?p ?o . 
} LIMIT 100
看来一些SPARQL后处理已经就绪

这让我一路走到那里。仍然希望我能找到SPARQL的解决方案,就像Cypher的跳数一样:

OPTIONAL MATCH path=s-[*1..3]-(o)

下面是一个在Virtuoso中工作的SPARQL查询。请注意,SPARQL W3C标准不支持此语法,它将在其他TripleStore中失败

PREFIX p: <http://www.example.org/person/> 
PREFIX x: <example.org/foo/>
# CONSTRUCT {?s ?p ?o}  # If you wish to return the graph
SELECT ?s ?p ?o   # To return the triples
FROM <http://localhost:8890/MYGRAPH>
where { p:Person_1 (x:foo|!x:bar){1,3} ?s  .
  ?s ?p ?o .
}LIMIT 100
另请参见K.Idehen的wiki条目:

感谢@Joshua Taylor在同一领域提供的建议。

包括处理此问题的{n,m}操作符,该操作符已经实现,并且将在Virtuoso中继续得到支持。这里有一个调整@tim的回应

使用DBpedia端点(一个Virtuoso实例)进行直播

在默认的DBpedia查询编辑器中打开查询源代码的Live

实际查询示例:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
SELECT DISTINCT ?s AS ?Entity 
                ?o AS ?Category 
WHERE { 
        ?s  rdf:type       <http://dbpedia.org/ontology/AcademicJournal> ; 
            rdf:type{1,3}  ?o 
      } 
LIMIT 100
请记住,在中不推荐使用r{n,m}运算符,但在Virtuoso中仍然支持它,您可以使用r/r?/r?如果您希望严格按照当前规范工作,请使用以下命令代替r{1,3}:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
SELECT DISTINCT ?s AS ?Entity 
                ?o AS ?Category 
WHERE { 
        ?s  rdf:type                          <http://dbpedia.org/ontology/AcademicJournal> ; 
            rdf:type / rdf:type? / rdf:type?  ?o 
       }
LIMIT 100

下面是一个针对Virtuoso中托管的DBpedia实例的示例

如果您正在寻找类似LinkedIn的联系人网络和个人之间分离程度的表示,下面是一个使用特定于大师的SPARQL扩展解决此特定问题的示例:

SELECT ?o                                              AS ?WebID
       ((SELECT COUNT (*) WHERE {?o foaf:knows ?xx}))  AS ?contact_network_size
       ?dist                                           AS ?DegreeOfSeparation 
       <http://www.w3.org/People/Berners-Lee/card#i>   AS ?knowee
  WHERE
    {
      {
        SELECT ?s ?o
        WHERE
          {
            ?s foaf:knows ?o
          }
      } OPTION (TRANSITIVE, t_distinct, t_in(?s), t_out(?o), t_min (1), t_max (4), t_step ('step_no') AS ?dist) .
      FILTER (?s= <http://www.w3.org/People/Berners-Lee/card#i>)
      FILTER (isIRI(?s) and isIRI(?o))
    }
  ORDER BY ?dist DESC (?contact_network_size)
  LIMIT 500
注意:这种方法是目前唯一一种在包含传递关系的实体关系图中公开实体之间的实际关系跃点的方法

实时链接到 实时链接到
Virtuoso在属性路径方面有一些缺陷,并且这个通配符模式变量是不允许的,不起作用。我已经在Github上提出了这个问题,请看,您可以尝试使用类似于x:foo |的东西!考虑到这两个属性都不存在,一句话,属性路径真的很棘手,特别是对于那些必须以高效方式实现它的人来说。在最坏的情况下,您的查询可能会导致大量连接并返回整个图。您对x:foo |的建议!x:bar*可用于构造和选择。我会用这些信息更新我原来的帖子。增加限额可能是个好主意。我很失望没有找到像Cypher那样能够指定跳数的选项,比如:OPTIONAL MATCH path=s-[*1..3]-值得注意的是,virtuoso确实支持属性路径草稿中出现的符号,但没有进入最终规范。您可以这样做,例如?s:p{n,m}?o查找长度为n的路径,使其在?s和?p之间。这看起来像我在属性路径上查找的文档。通过Twitter感谢K.Idehen
PREFIX p: <http://www.example.org/person/> 
PREFIX x: <example.org/foo/>
# CONSTRUCT {?s ?p ?o}  # If you wish to return the graph
SELECT ?s ?p ?o   # To return the triples
FROM <http://localhost:8890/MYGRAPH>
where { p:Person_1 (x:foo|!x:bar){1,3} ?s  .
  ?s ?p ?o .
}LIMIT 100
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
SELECT DISTINCT ?s AS ?Entity 
                ?o AS ?Category 
WHERE { 
        ?s  rdf:type       <http://dbpedia.org/ontology/AcademicJournal> ; 
            rdf:type{1,3}  ?o 
      } 
LIMIT 100
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
SELECT DISTINCT ?s AS ?Entity 
                ?o AS ?Category 
WHERE { 
        ?s  rdf:type                          <http://dbpedia.org/ontology/AcademicJournal> ; 
            rdf:type / rdf:type? / rdf:type?  ?o 
       }
LIMIT 100
SELECT ?o                                              AS ?WebID
       ((SELECT COUNT (*) WHERE {?o foaf:knows ?xx}))  AS ?contact_network_size
       ?dist                                           AS ?DegreeOfSeparation 
       <http://www.w3.org/People/Berners-Lee/card#i>   AS ?knowee
  WHERE
    {
      {
        SELECT ?s ?o
        WHERE
          {
            ?s foaf:knows ?o
          }
      } OPTION (TRANSITIVE, t_distinct, t_in(?s), t_out(?o), t_min (1), t_max (4), t_step ('step_no') AS ?dist) .
      FILTER (?s= <http://www.w3.org/People/Berners-Lee/card#i>)
      FILTER (isIRI(?s) and isIRI(?o))
    }
  ORDER BY ?dist DESC (?contact_network_size)
  LIMIT 500