【问题标题】:Create subgraph query in Gremlin around single node with outgoing and incoming edges在 Gremlin 中围绕具有传出和传入边的单个节点创建子图查询
【发布时间】:2020-07-12 11:42:45
【问题描述】:

我有一个大型 Janusgraph 数据库,我想创建一个以一种节点类型为中心的子图,包括特定类型的传入和传出节点。

在 Cypher 中,查询如下所示:

MATCH (a:Journal)N-[:PublishedIn]-(b:Paper{paperTitle:'My Paper Title'})<-[:AuthorOf]-(c:Author) 
RETURN a,b,c

这是我在 Gremlin 中尝试过的:

sg = g.V().outE('PublishedIn').subgraph('j_p_a').has('Paper','paperTitle', 'My Paper Title')
     .inE('AuthorOf').subgraph('j_p_a')
     .cap('j_p_a').next()

但是我得到一个语法错误。 'AuthorOf' 和 'PublishedIn' 不是唯一以 'Paper' 节点结尾的边类型。

谁能告诉我如何在 Gremlin 中正确执行这个查询?

【问题讨论】:

  • outE 步骤将产生边缘,has 步骤将检查这些边缘的属性,之后您应该使用inV 而不是inE。如果没有您的数据模型,很难确切知道您需要什么,但可能您需要inV().outE() 或类似的东西,因为您需要遵循边-顶点-边的模式。 inV 可能需要在查看 Cypher 查询之前进行。
  • 我将添加一个我认为反映您的 Cypher 查询的答案。如果没有数据模型,我无法轻松测试。

标签: cypher gremlin graph-databases janusgraph


【解决方案1】:

正如您在查询中所写的,outE 步骤产生边,has 步骤将检查这些边上的属性,随后查询处理器将期待 inV 而不是另一个 inE。如果没有您的数据模型,很难确切知道您需要什么,但是,看看 Cypher,我认为这就是您想要的。

sg = g.V().outE('PublishedIn').
           subgraph('j_p_a').
           inV().
           has('Paper','paperTitle', 'My Paper Title').
           inE('AuthorOf').
           subgraph('j_p_a')
           cap('j_p_a').
           next()

编辑添加:

由于我没有您的数据,我使用了我的航线图。我根据您的查询对该查询进行了建模,并使用了一些select 步骤来限制处理的数据大小。这似乎在我的测试中有效。希望您能看到我所做的更改并在您的查询中尝试这些更改。

sg = g.V().outE('route').as('a').
      inV().
      has('code','AUS').as('b').
      select('a').
      subgraph('sg').
      select('b').
      inE('contains').
      subgraph('sg').
      cap('sg').
      next()  

【讨论】:

  • 我接受了这个答案,因为它似乎解决了我遇到的语法问题,并且根据解释说得通。但是当我尝试运行它时查询超时。我在“paperTitle”属性上有一个索引,以方便模糊搜索。您对此查询中的瓶颈有任何见解吗?
  • 如果您尝试使用一些限制 (10) 步骤,您会看到一些结果。您希望此查询涉及多少条边/顶点?
  • 如果我使用确切的“paperTitle”,则应该有一个“Paper”节点、一个“Journal”节点和 4-6 个 Author 节点。
  • Ok 因此,当所写的查询从查看图中的每个顶点开始时,它可能会查看很多边。我将尝试编辑我的答案以限制该部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-30
  • 1970-01-01
  • 2019-07-26
  • 2017-04-17
  • 2019-06-13
  • 1970-01-01
相关资源
最近更新 更多