neo4j 查询转换以在函数中使用
neo4j query conversion to use in function
我有这样的查询,它通常接受 {}
括号中的一个参数。
MATCH (pr:Person)-[:person_successor]->(next:Person)
WHERE (:Queue {name: 'A'}) -[:queue_person]-> (pr)
RETURN pr.name, next.name
我想作为 Queue name
传递几个可能的参数而不是一个,例如{name: 'A' or name: 'B'}
。所以我希望有来自许多队列的人和他们的继任者。队列也相互连接。
但是这样的查询是不可能的并抛出异常:
MATCH (pr:Person)-[:person_successor]->(next:Person)
WHERE (:Queue {name: 'A' or name: 'B'}) -[:queue_person]-> (pr)
RETURN pr.name, next.name
不是上面的,而是这样工作的:
MATCH (q:Queue)-[:queue_person]->(pr:Person)-[:person_successor]->(:next:Person)
WHERE q.name in ['A','B']
RETURN pr.name, next.name
但我想使用 (pr:Person)-[:person_successor]->(next:Person)
而不是 (q:Queue)-[:queue_person]->(pr:Person)-[:person_successor]->(:next:Person)
因为它以某种方式破坏了人的秩序所以我没有:
A B
B C
C D
D E ...
由于match子句中的queue
不知何故受到了干扰。
是否可以在第二行的 where 子句中传递参数并保持队列和人员之间的关系 -[:queue_person]-> (pr)
就像下面的无效代码段查询一样?
WHERE (:Queue {name in ['A','B']) -[:queue_person]-> (pr)
我不清楚顺序与
有何不同
MATCH (q:Queue)-[:queue_person]->(pr:Person)-[:person_successor]->(:next:Person)
WHERE q.name in ['A','B']
RETURN pr.name, next.name
很难从您分享的回复中看出。
另一种写法是
MATCH (q:Queue)
WHERE q.name in ['A','B']
WITH q
MATCH (pr:Person)-[:person_successor]->(next:Person)
WHERE (q)-[:queue_person]->(pr)
RETURN pr.name, next.name
我觉得你问题中这个查询的问题
MATCH (q:Queue)-[:queue_person]->(pr:Person)-[:person_successor]->(:next:Person)
WHERE q.name in ['A','B']
RETURN pr.name, next.name
在此:(:next:Person)
。你只需要更改为 (next:Person)
但如果不是,您可以使用 UNWIND :
UNWIND ["A", "B"] AS name
MATCH (pr:Person)-[:person_successor]->(next:Person)
WHERE (:Queue {name: name}) -[:queue_person]-> (pr)
RETURN pr.name, next.name
我有这样的查询,它通常接受 {}
括号中的一个参数。
MATCH (pr:Person)-[:person_successor]->(next:Person)
WHERE (:Queue {name: 'A'}) -[:queue_person]-> (pr)
RETURN pr.name, next.name
我想作为 Queue name
传递几个可能的参数而不是一个,例如{name: 'A' or name: 'B'}
。所以我希望有来自许多队列的人和他们的继任者。队列也相互连接。
但是这样的查询是不可能的并抛出异常:
MATCH (pr:Person)-[:person_successor]->(next:Person)
WHERE (:Queue {name: 'A' or name: 'B'}) -[:queue_person]-> (pr)
RETURN pr.name, next.name
不是上面的,而是这样工作的:
MATCH (q:Queue)-[:queue_person]->(pr:Person)-[:person_successor]->(:next:Person)
WHERE q.name in ['A','B']
RETURN pr.name, next.name
但我想使用 (pr:Person)-[:person_successor]->(next:Person)
而不是 (q:Queue)-[:queue_person]->(pr:Person)-[:person_successor]->(:next:Person)
因为它以某种方式破坏了人的秩序所以我没有:
A B
B C
C D
D E ...
由于match子句中的queue
不知何故受到了干扰。
是否可以在第二行的 where 子句中传递参数并保持队列和人员之间的关系 -[:queue_person]-> (pr)
就像下面的无效代码段查询一样?
WHERE (:Queue {name in ['A','B']) -[:queue_person]-> (pr)
我不清楚顺序与
有何不同MATCH (q:Queue)-[:queue_person]->(pr:Person)-[:person_successor]->(:next:Person)
WHERE q.name in ['A','B']
RETURN pr.name, next.name
很难从您分享的回复中看出。
另一种写法是
MATCH (q:Queue)
WHERE q.name in ['A','B']
WITH q
MATCH (pr:Person)-[:person_successor]->(next:Person)
WHERE (q)-[:queue_person]->(pr)
RETURN pr.name, next.name
我觉得你问题中这个查询的问题
MATCH (q:Queue)-[:queue_person]->(pr:Person)-[:person_successor]->(:next:Person)
WHERE q.name in ['A','B']
RETURN pr.name, next.name
在此:(:next:Person)
。你只需要更改为 (next:Person)
但如果不是,您可以使用 UNWIND :
UNWIND ["A", "B"] AS name
MATCH (pr:Person)-[:person_successor]->(next:Person)
WHERE (:Queue {name: name}) -[:queue_person]-> (pr)
RETURN pr.name, next.name