如何使用SPARQL返回完整的树?

如何使用SPARQL返回完整的树?,sparql,graphdb,Sparql,Graphdb,我正试图建立一个POC搜索引擎的内部网站在我的公司。我正在使用GraphDB,并在其中放置了一些基本数据,如下所示: Page -hasField-> Field Field -hasOption-> Option 并非所有字段都有选项。所有类型都有我将要搜索的标签。我要返回的是标签包含文本、从包含报告到节点的路径以及沿途所有节点和边的标签的任何页面、字段、或选项。因此,如果页面名称包含文本,则只返回页面及其标签。如果某个选项包含文本Page-hasField->Field-ha

我正试图建立一个POC搜索引擎的内部网站在我的公司。我正在使用GraphDB,并在其中放置了一些基本数据,如下所示:

Page -hasField-> Field

Field -hasOption-> Option
并非所有字段都有选项。所有类型都有我将要搜索的标签。我要返回的是标签包含文本、从包含报告到节点的路径以及沿途所有节点和边的标签的任何
页面
字段
、或
选项
。因此,如果页面名称包含文本,则只返回页面及其标签。如果某个选项包含文本
Page-hasField->Field-haspoption->option
,则该选项也将与其所有标签一起返回。这样我们就可以更好地描述返回页面的原因,以及用户如何与页面交互以获得他们想要的结果

在我看来,我已经将问题分为三个部分,并为每个部分找到了各种解决方案,但我似乎无法将它们联系在一起。第一种方法是查找节点及其所属的报告(很容易完成)

第二种方法是沿路径查找所有三元组。虽然我可以通过硬编码关系来实现这一点,但如果可能的话,我希望保持这种通用性,以便在构建图表时自动拾取新的关系

第三种方法是将结果组织成一棵树,每个页面作为根,嵌套
字段
选项
,以便应用程序能够将页面显示为结果,并在其下方显示每个匹配字段/选项的描述。我发现,如果我使用带有JSON-LD的
CONSTRUCT
作为输出格式(现在使用所有的三元组进行测试),这会让我在大部分情况下达到目的,但是它不会构建树,而是列出每个节点以及子节点的URI。我已经读到,您可以在这方面进行“框架”,但我不确定这是否是在SPARQL或应用程序中完成的

因此,总结一下我的问题:

  • 是否可以使用SPARQL以我想要的格式获取我想要的信息
  • 我对这个问题的思考正确吗?如果没有,我应该如何考虑
  • 是否可以返回构成两个节点之间路径的所有三元组?更具体地说,如果我有一个节点对列表,是否可以返回组成所有对之间所有路径的所有三元组
  • 是否可以将前面的三元组结果集转换为JSON中的树?最好使用“框架”还是我应该寻找其他术语

我认为您应该使用or连接器,因为您面临全文搜索问题(“标签包含文本”)

这些连接器允许您指定一组索引路径(“FTS分子”)。不过,这仍然是一组固定的路径,你不能说“任何道具都会在任何方向上分支”

要返回匹配字段,请使用

关于您的另一个问题“是否可以返回组成两个节点之间的路径的所有三元组?”:在探索所有路径的一般情况下,这在SPARQL中是不可能的(可以使用SPARQL属性路径来探索某些道具组合,但不能在道具路径中使用变量)。
Blazegraph和Stardog有一些相关的扩展。

框架不是SPARQL规范的一部分,所以我想您必须在客户端构建树。2)不确定“泛型”是什么意思-有SPARQL属性路径,但仍然不确定您要问什么。如果您提供适当的RDF示例数据+预期结果,则通常会更容易。SPARQL通常会返回表(
SELECT
)或四元组/三元组(
CONSTRUCT
),它们是四元组/三元组查询的结果。这些不是树。你是否需要一棵树似乎值得怀疑,尽管这是你决定想要的——也就是说,你现在可能正在与一棵树搏斗,退一步谈谈你在开始时拥有什么,以及你在最后想要得到什么,这可能会给你带来更好的净结果。@AKSW by“generic”,我的意思是,我可能不知道一对节点之间的确切关系,因此硬编码“hasField”和“haspoption”将在早期阶段起作用,但以后可能不起作用。基本上,我可以做?a hasField?b.?b haspoption?c.“但是如果添加了另一个关系,我必须更改查询。我能做“a?r?b”,但我不能做“a?r+?b”。我也可以做“a?r?b?b?s?c”,但如果添加了第三层,那么查询将找不到它。所以,我真的认为这是一个在两个节点之间找到最短路径并返回所有边和节点的问题。@Talled我认为你可能是对的,我试图用一种方式表达我的问题,让这种可能性保持开放。对我来说,整个三重奏哲学是一个新的范例,我还没有完全摸索它。我试着向大家展示我将如何努力解决这个问题,这样也许会使我误入歧途的地方更加明显。