在 Gremlin 中围绕具有传出和传入边的单个节点创建子图查询
Create subgraph query in Gremlin around single node with outgoing and incoming edges
我有一个大型 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
。没有您的数据模型,很难确切地知道您需要什么,但是,看看 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()
我有一个大型 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
。没有您的数据模型,很难确切地知道您需要什么,但是,看看 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()