cypher - 在 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 中正确执行此查询吗?
解决方案
正如您在查询中所写的那样,该outE
步骤会产生边,并且该has
步骤将检查这些边上的属性,之后查询处理器将期望一个inV
not 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()