postgresql 如何匹配…WHERE {path_with_properties}在AGE中工作

xoshrz7s  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(6)|浏览(124)

根据Neo4j关于WHERE子句的文档,我应该能够使用具有如下属性的模式过滤搜索:

SELECT *
FROM cypher('test', $$
    MATCH (n:Person)
    WHERE (n)-[:KNOWS]-({name: 'Timothy'})
    RETURN n.name, n.age
$$) AS (name agtype, age agtype);

但是,我得到一个错误,它说:

ERROR:  syntax error at or near ":"
LINE 4: WHERE (n)-[:KNOWS]-({name: 'Timothy'})
                   ^

我猜这个特性还没有在AGE中实现,但是有没有一种方法可以让它工作,或者有没有一种替代方法可以得到类似的结果?

9gm1akwq

9gm1akwq1#

是的,您可以使用exists()查找具有属性的路径是否存在,如

SELECT * FROM cypher('test', $$
MATCH (n:Person)
WHERE exists((n)-[:KNOWS]-({name: 'Timothy'}))
RETURN n.name, n.age
$$) AS (name agtype, age agtype);
aor9mmx1

aor9mmx12#

到目前为止,我们还不能在Apache时代恢复无向关系。您需要建立定向关系,并且只能检索定向关系。
您提到的查询将给予您一个错误,因为在该查询中没有边的方向。
我们可以尝试的方法如下:

SELECT * FROM cypher ('graph', $$
MATCH (a:Emp), (b:Emp)
WHERE a.name = "hossam" AND b.name = "omar"
CREATE (a)-[e:FRIENDS{ type:"<->" }]->(b)
RETURN e
$$) as (e agtype);

现在,您已经将其视为无方向或双向边,并可以使用该查询检索它。

SELECT * FROM cypher ('graph', $$
MATCH (a)-[e:FRIENDS]->(b)
WHERE e.type = "<->"
RETURN e
$$) as (e agtype);
cfh9epnr

cfh9epnr3#

要得到类似的结果,可以完全忽略WHERE子句:

SELECT * FROM cypher('test', $$
MATCH (u)-[:KNOWS]-({name: 'Timothy'})
RETURN u.name, u.age $$)
AS (name agtype, age agtype);

这样,您将找到具有关系KNOWSTimothy的节点的双向关系,反之亦然。

blmhpbnm

blmhpbnm4#

您可以简单地使用以下操作:

SELECT *
FROM cypher('test', $$
    MATCH (n:Person)-[:KNOWS]-({name: 'Timothy'})
    RETURN n.name, n.age
$$) AS (name agtype, age agtype);

MATCH子句将使所有n个用户都具有指定的条件,这将与AGE一起工作,我自己也试过了。
我希望这能解决问题。

kxe2p93d

kxe2p93d5#

对于在Apache时代检索关系应该是定向的,你不能检索非定向关系。首先,创建定向关系,然后可以使用以下查询来实现类似的结果:

SELECT *
FROM cypher('test', $$
     MATCH (p:Person)-[:KNOWS]->(m)
     WHERE m.name = 'Timothy'
     RETURN p.name, p.age
$$) AS (name agtype, age agtype);

在上面的查询中,我们将匹配m和p之间的关系,然后使用条件WHERE m.name = 'Timothy',根据m的name属性过滤节点。如果匹配,则返回p的name和age。我们在这里也假设知道关系存在,正如我已经提到的。

dgtucam1

dgtucam16#

Apache AGE目前只支持定向关系,这就是错误的原因。更新后的声明将是:

SELECT *
FROM cypher('test', $$
    MATCH (n:Person)
    WHERE exists((n)-[:KNOWS]->({name: 'Timothy'}))
    RETURN n.name, n.age
$$) AS (name agtype, age agtype);

相关问题