NEO4j加入并选择查询

问题描述 投票:0回答:1

neo4j的新启动器。基本问题。 employeetoprojectsemployees是数据库中的两种类型的节点。

第一个查询,我想让员工返回两个或多个项目我用这个

MATCH (md:employeetoproject)
RETURN md.eid as ID, count(md.projectid) AS count
ORDER BY count DESC

两个问题:

  1. 我只想将视野限制为5岁以上的员工项目该怎么做?
  2. 此外,我想将员工名称从employee表返回到加入结果。我该怎么做呢?谢谢
neo4j cypher
1个回答
1
投票

欢迎来到图形数据库的世界!

需要记住的几件事,Neo4j没有表,图形数据库术语与您惯用的有点不同。

Neo4j具有节点和关系。节点可能具有标签,使其像表中的条目一样,但是某些标签的节点不需要严格的属性集(这与RDBMS中的表属性不同),并且节点可以被多标签,因此图形数据库模型稍微灵活一些,允许节点根据您要如何查看数据的上下文来扮演多个角色。

图模型中的数据建模也不同,因为应该创建和使用关系,而不是使用外键/表联接方法。另外,不需要联接表,只需使用关系来连接有问题的节点。不要以关系数据的方式考虑它,它们不是表联接。

更图形化的数据建模方法可能是:

(:Employee)-[:WORKS_ON]->(:Project)

所以您将具有:Employee节点,:Project节点和:WORKS_ON关系将它们连接起来。在数据加载/导入过程中,您可以创建所有:Employee节点,然后创建所有:Project节点,然后创建它们之间的关系。另外,要用于查找的相关属性的这两个标签上的索引也将对将来的查询很有用,例如:Employee(eid)上的索引。

查询查找从事5个以上项目的员工,并显示员工姓名,eid和人数的查询,如下所示:

MATCH (e:Employee)
WITH e, size((e)-[:WORKS_ON]->(:Project)) as count
WHERE count > 5
RETURN e.name as name, e.eid as eid, count
ORDER BY count DESC

[请注意,如果:WORKS_ON关系始终连接到:Project节点,那么您可以从该模式中删除标签,并且通过对:WORKS_ON关系进行度检查,查询将变得更加高效,而无需扩展该关系并进行过滤另一端的节点,以确保它是一个:Project节点:

WITH e, size((e)-[:WORKS_ON]->()) as count

这是我在所需模式上使用size()而不是匹配到完整模式并使用count()聚合函数的主要原因。该方法很好用,但不能如上所述优化以用于关联度。

但是,作为参考,使用MATCH中的完整模式和count()函数,您将获得相同的答案:

MATCH (e:Employee)-[:WORKS_ON]->(p:Project)
WITH e, count(p) as count
WHERE count > 5
RETURN e.name as name, e.eid as eid, count
ORDER BY count DESC
© www.soinside.com 2019 - 2024. All rights reserved.