首页 > 解决方案 > 在 Gremlin 中围绕具有传出和传入边的单个节点创建子图查询

问题描述

我有一个大型 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 中正确执行此查询吗?

标签: cyphergremlingraph-databasesjanusgraph

解决方案


正如您在查询中所写的那样,该outE步骤会产生边,并且该has步骤将检查这些边上的属性,之后查询处理器将期望一个inVnot another 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()  

推荐阅读