这是数据设置:
select * from cypher('test', $$ CREATE (david:Person {name: 'David'})
CREATE (alice:Person {name: 'Alice'})
CREATE (bob:Person {name: 'Bob'})
CREATE (charlie:Person {name: 'Charlie'})
CREATE (eve:Person {name: 'Eve'})
CREATE (david)-[:FRIEND]->(alice)
CREATE (david)-[:FRIEND]->(bob)
CREATE (david)-[:FRIEND]->(charlie)
CREATE (david)-[:FRIEND]->(eve)
CREATE (alice)-[:FRIEND]->(bob)
CREATE (charlie)-[:FRIEND]->(bob)
CREATE (eve)-[:FRIEND]->(frank:Person {name: 'Frank'})
CREATE (frank)-[:FRIEND]->(eve)
CREATE (alice)-[:FRIEND]->(charlie) $$ ) as (a agtype);
我正在搜索返回 David 的朋友并且有 2 个或更多外向关系的人的查询。根据文档,这个查询应该这样做:
SELECT *
FROM cypher('graph_name', $$
MATCH (david {name: 'David'})-[]-(otherPerson)-[]->()
WITH otherPerson, count(*) AS foaf
WHERE foaf > 1
RETURN otherPerson.name
$$) as (name agtype);
但是这会返回 Alice、Eve 和 Charlie。就像完全忽略了 WHERE 子句一样。正确的查询是什么?
Apache AGE 似乎确实忽略了 cypher 函数中的 WHERE 子句。一种方法是在 cypher 函数外使用 WHERE 子句并在 RETURN 子句中添加 foaf,就像这样:
SELECT * FROM cypher('test', $$
MATCH (david {name: 'David'})-[]-(otherPerson)-[]->()
WITH otherPerson, count(*) AS foaf
RETURN otherPerson.name, foaf
$$) as (name agtype, foaf agtype)
WHERE foaf > 1;