Open jtomek opened 6 months ago
@jtomek There is a PR (#1452) for this feature. It is based on PG15.
It seems you're trying to execute Cypher queries within a PostgreSQL environment using the cypher function. The error you're encountering is due to the incorrect usage of the '|' symbol in the label definition within your MATCH clause. In Cypher, '|' is not used to denote multiple labels for a node. Instead, you should use the IN keyword.
Here's the corrected version of your first query:
sql Copy code SELECT * FROM cypher('playground', $$ MATCH (n) WHERE n:Movie OR n:Person RETURN n $$) AS (v agtype); This query will match nodes that have either the label 'Movie' or 'Person'.
Alternatively, you can use your second query as you provided:
sql Copy code SELECT * FROM cypher('playground', $$ MATCH (n) WHERE label(n) = 'Movie' OR label(n) = 'Person' RETURN n $$) AS (v agtype);
Both queries should achieve the same result, with the second one explicitly checking the labels of nodes. Choose whichever you find more readable or preferable for your use case.
@diangamichael
In Cypher, '|' is not used to denote multiple labels for a node.
This is not correct. According to the openCypher specification, the pipe operator '|' is a valid way to define union of multiple labels.
This issue is stale because it has been open 45 days with no activity. Remove "Abondoned" label or comment or this will be closed in 7 days.
This issue is stale because it has been open 60 days with no activity. Remove "Abondoned" label or comment or this will be closed in 14 days.
WHERE label(n) = 'Movie' OR label(n) = 'Person'
works but is fairly ungainly. Per the openCypher spec (:Foo|Bar)
should be supported.
Apache AGE does not support multiple labels, yet. There is a PR in review that could add this in the future. However, it is a large PR and needs to be thoroughly reviewed.
Hey @jrgemignani thankyou for chiming in, aware of the multi-label PR but this is a separate issue with querying that's needed even with single-label support.
What should be possible is being able to OR between labels in a query which is relevant for single labels, not ANDing for situations where you want to match on multiple labels on a query (which I believe in openCypher terms is expressed as [:Foo:Bar]
).
So if you have the following in your db:
(:City)-[:AirRoute]-(:City)
(:City)-[:SeaRoute]-(:City)
Being able to run a query and say 'Give me any Air OR Sea route between these two cities', which should be possible (in openCypher terms) via
(:City { name: 'London' })-[:SeaRoute|AirRoute]-(:City { name: :'Rotterdam' })
You can do it today via a WHERE clause as shown above but the syntax is super clunky.
Hi @alexgraul Although the PR refers it as 'multi-label', it does support the |
operator for combining multiple single labels in MATCH queries. For now you can look at the regression test file to see what kind of multi-label queries are supported.
ohhh nice! Awesome, thankyou for clarifying!
Hi, how do I run this?
I get
Is this the only way to get what I want?