neo4j Cypher -是否可以在合成数据上声明公共表表达式?

gzszwxb4  于 2022-11-05  发布在  其他
关注(0)|答案(2)|浏览(161)

要玩SQL或解释一些语言特性,往往不需要真实的数据库表中的数据,只需要常用的表表达式即可:

with my_sample (id, name, age) as (values
  (1, 'Alice', 17),
  (2, 'Bob', 19)
), can_drive_car (name) as (
  select name from my_sample where age >= 18
)
select * from can_drive_car

在Cypher中有什么等价的东西吗?我的意思是在不影响数据库中的数据的情况下创建图形,查询它并返回结果。伪代码:

WITH CREATE (:Person {name:'Alice'})-[:FRIEND]->(:Person {name:'Bob'})-[:FRIEND]->(:Person {name:'Charlie'})
MATCH p=shortestPath((a {name:'Alice'})-[*]->(c {name:'Charlie'}))
RETURN p

我知道Cypher WITH子句。尽管命名相同,但在我看来,在Cypher中-不像SQL -该子句只将前一个查询部分的结果(在Neo4j数据库中的真实的图形数据上调用)传递给后续流,AFAIK它不能像我的SQL示例中那样编造任何东西。

kxxlusnw

kxxlusnw1#

遗憾的是,我还没有找到任何100%符合要求的工具,但有几个工具可能会在这方面给予你更多的灵活性:
1.虚拟节点和关系
https://neo4j.com/labs/apoc/4.1/virtual/virtual-nodes-rels/。这些是在查询期间存在的节点和rel。但是,它们仅用于可视化,您不能在它们上执行匹配。例如,下面将返回虚拟节点和rel:

CALL apoc.create.vNode(['Person'],{name:'Alice'}) yield node as a
CALL apoc.create.vNode(['Person'],{name:'Bob'}) yield node as b
CALL apoc.create.vNode(['Person'],{name:'Charlie'}) yield node as c
CALL apoc.create.vRelationship(a, 'FRIEND', {}, b) yield rel as rel1
CALL apoc.create.vRelationship(b, 'FRIEND', {}, c) yield rel as rel2
RETURN *

但是,一旦您加入MATCH陈述式,它就不会传回任何东西。

CALL apoc.create.vNode(['Person'],{name:'Alice'}) yield node as a
CALL apoc.create.vNode(['Person'],{name:'Bob'}) yield node as b
CALL apoc.create.vNode(['Person'],{name:'Charlie'}) yield node as c
CALL apoc.create.vRelationship(a, 'FRIEND', {}, b) yield rel as rel1
CALL apoc.create.vRelationship(b, 'FRIEND', {}, c) yield rel as rel2
MATCH p=shortestPath((a)-[*]->(c))
RETURN p

1.虚拟资源
https://neo4j.com/labs/apoc/4.1/virtual-resource/这是一种在查询neo4j节点的同时查询外部数据源的方法。外部数据源的数据不会被带入主图中,但是您 * 可以 * 使用虚拟资源中的节点进行查询。但是,它并不符合要求。因为似乎没有一种简单的方法可以使其独立,您需要有一个包含“虚拟”数据的外部资源。它可以像CSV文件一样简单,但无论如何。
1.图形投影,使用图形数据科学库
GDS库在图形投影上执行其操作,而不是像SQL中的临时表那样在数据的写入磁盘副本上执行操作。您可以筛选节点和关系以使用较小的数据集。但是,您不能向图形投影添加新节点。
我同意,这将是非常有用的,有这样的东西虽然-我希望一个出现!

fcg9iug3

fcg9iug32#

对于一个快速(和肮脏)的解决方案,我通常通过向我正在创建的节点添加一个额外的测试标签来解决这个问题,例如:

CREATE (:Person:Test {name:'Alice'})-[:WORKS_FOR]->(:Manager:Test {name:'Bob'})-[:DRIVES]->(:Car:Test {name:'Ford Cortina'})

然后,当我完成MATCH(x:Test) DETACH DELETE x时,一切都清楚了。
不理想,但如果您的测试很简单,可能对您有用。

相关问题