我不知道如何用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示例,但由于我遇到了错误,因此必须将其删除,否则,不知道如何在具有不同标签的节点上比较具有不同名称的属性(我确定“哪里”错了...)
任何帮助将不胜感激。
答案 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中的保留关键字)而失败了。