需要帮助将Neo4j Cypher脚本转换为Gremlin

时间:2019-05-30 12:32:52

标签: cypher gremlin

我不知道如何用Gremlin重写Cypher脚本。

首先,我们使用.Net Neo4j客户端连接到Neo4j数据库并在其上运行Cypher查询。然后,我们决定添加一个抽象层并连接到Gremlin服务器(该服务器目前托管相同的Neo4j数据库)。因此,现在我需要将我们的查询从Cypher转换为Gremlin,我发现这相当困难。

这里是其中之一:

MATCH (pc:ProductCategory)-[:HasRootCategory]->(r:RootCategory)
WHERE NOT (:ProductCategory)-[]->(pc) 
AND pc.Id = r.RootId 
RETURN pc;

我失败的尝试之一: g.V().match(as("pc").out("HasRootCategory").as("r"),as("pc").in().has('label', 'ProductCategory').count().is(0))).select("pc", "r").where("pc.Id", eq("r.RootId")).select("pc")

我找到了一个使用“ match(as”结构)的stackoverflow示例,但由于我遇到了错误,因此必须将其删除,否则,不知道如何在具有不同标签的节点上比较具有不同名称的属性(我确定“哪里”错了...)

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

以下遍历应等效:

g.V().hasLabel("ProductCategory").as("pc").
  not(__.in().hasLabel("ProductCategory")).
  out("HasRootCategory").as("r").
  where("pc", eq("r")).
    by("Id").
    by("RootId").
  select("pc")

由于您实际上不需要r标签,因此可以对查询进行一些调整:

g.V().hasLabel("ProductCategory").as("pc").
  not(__.in().hasLabel("ProductCategory")).
  filter(out("HasRootCategory").
         where(eq("pc")).
           by("Id").
           by("RootId"))

最后要提到的是:如果一个ProductCategory顶点只能通过一个(或多个)特定的边缘标签连接到另一个ProductCategory顶点,这将无处可去,那么这样做会更好:

g.V().hasLabel("ProductCategory").as("pc").
  not(inE("KnownLabelBetweenCategories")).
  filter(out("HasRootCategory").
         where(eq("pc")).
           by("Id").
           by("RootId"))

换句话说,match()不被弃用。我猜您尝试过在Groovy中进行遍历,但由于您没有使用__.as()as是Groovy中的保留关键字)而失败了。