【问题标题】:Need help converting a Neo4j Cypher script to Gremlin需要帮助将 Neo4j Cypher 脚本转换为 Gremlin
【发布时间】:2019-10-16 02:51:18
【问题描述】:

我不知道如何在 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")

我在stackoverflow上找到了一个使用这个'match(as'结构的例子,但它必须被弃用,因为我遇到了一个错误。另外,不知道如何在具有不同标签的节点上比较具有不同名称的属性(我确定“哪里”是错误的......)

任何帮助将不胜感激。

【问题讨论】:

    标签: cypher gremlin


    【解决方案1】:

    下面的遍历应该是等价的:

    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 中的保留关键字)。

    【讨论】:

    • 谢谢。这工作得很好,脚本看起来不像我想象的那么令人生畏^-^;我还有一个问题:你如何翻译'match (p:Person)-[:HasChild|HasSibling]->(:Person)'之类的东西 - 让所有顶点通过一条或另一条边连接?
    • 您可以在outoutEininEbothbothE中指定多个标签。因此它只是:g.V().hasLabel("Person").filter(out("HasChild","HasSibling").hasLabel("Person"))
    猜你喜欢
    • 1970-01-01
    • 2018-11-09
    • 2021-12-14
    • 2023-03-03
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    相关资源
    最近更新 更多