Neo4j-模型节点和关系
我以{公司:[c1,c2,c3],名称:[d1,d2,d3]}的格式获得了100000名员工数据,其中c1是员工的第一家公司,c2是第二家公司,c3是第三家公司。。。 这同样适用于雇员在这些公司的职务。 这里的切换是指员工从c1->c2或d1->d2切换 我希望用neo4j对此进行建模,以回答以下问题:Neo4j-模型节点和关系,neo4j,model,cypher,Neo4j,Model,Cypher,我以{公司:[c1,c2,c3],名称:[d1,d2,d3]}的格式获得了100000名员工数据,其中c1是员工的第一家公司,c2是第二家公司,c3是第三家公司。。。 这同样适用于雇员在这些公司的职务。 这里的切换是指员工从c1->c2或d1->d2切换 我希望用neo4j对此进行建模,以回答以下问题: 获取公司开关,例如c1->c2,c2->c3 获取d1->d2、d2->d3等的指定开关 对于公司开关c1->c2,什么是名称开关d1->d2 我尝试了这段代码,但即使我已经建立了索引,它也会一
CREATE CONSTRAINT ON (u:User) ASSERT u.id IS UNIQUE;
CREATE CONSTRAINT ON (n:Company) ASSERT n.name IS UNIQUE;
CREATE CONSTRAINT ON (d:Designation) ASSERT d.name IS UNIQUE;
CREATE INDEX ON :Company(type),
USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS FROM "file:/positions.csv" AS row
WITH row
// user
MERGE (u:User {id: row.user})
ON CREATE SET u.id = row.user
//comp
MERGE (n:Company {name:row.name})
ON CREATE SET n.name = row.name, n.type = row.type
// --------------------------- Approach 2
CREATE (p:Position{user: row.user, duration: toFloat(row.duration), sequence:toInt(row.sequence)})
CREATE (p)-[:AT]->(n)
// optionally build Designation
FOREACH(c1 IN (CASE WHEN row.type = 'c' THEN [1] else [] END) |
// maybe check for empty
//title
MERGE (d:Designation {title:row.title})
ON CREATE SET d.title = row.title
CREATE (p)-[:AS]->(d)
)
WITH row
MATCH (u:User{id:row.user})
MATCH (p:Position{user: u.id, sequence:0})
CREATE (u)-[:NEXT]->(p)
WITH row, p
// todo - link sequence 0 position
MATCH (p:Position {user: row.user})
WITH p ORDER BY p.sequence
WITH COLLECT(p) AS positions
FOREACH(i in RANGE(0, length(positions)-2) |
FOREACH(pos1 in [positions[i]] |
FOREACH(pos2 in [positions[i+1]] |
CREATE UNIQUE (pos1)-[:NEXT]->(pos2))))
这里的顺序是用户/员工持有的职位的顺序。这里是一个如何对数据建模的示例,以及对用例的查询 此示例数据模型使用由
历史关系
分隔的作业
节点的“链”来记录员工的工作历史。最近的工作直接附加到员工(也通过历史记录
关系)。每个作业
节点与公司
节点有一个关系,与指定
节点有另一个关系
创建示例数据
创建
(c1:公司{id:123,名称:'Acme Corp.}),
(c2:公司{id:321,名称:'皮奥里亚银行'}),
(c3:公司{id:444,名称:'合并罐'}),
(d1:名称{id:234,头衔:'助理书记'}),
(d2:名称{id:345,标题:'办事员'}),
(d3:名称{id:456,标题:'首席办事员'}),
(e1:Employee{id:123456789,姓名:'Fred Murphy'}),
(c1)(d1),
(c2)(d2),
(c3)(d3),
(e1)-[:HISTORY]->(j3)-[:HISTORY]->(j2)-[:HISTORY]->(j1);
获取公司更改(带开始日期):
MATCH p=(n)您的问题的术语非常模糊,很可能会被关闭。例如,“指定”和“开关”是什么意思?请详细解释您的用例和数据模型,以便其他人理解。另外,如果你有现有的密码,也要显示出来。谢谢你的回复,用相关的术语编辑。你有没有尝试过为你的数据建模?如果是这样,请分享它们,以及你所面临的挑战。如果您没有,那么请分享您对正在考虑的方法的任何想法。
CREATE
(c1:Company {id: 123, name: 'Acme Corp.'}),
(c2:Company {id: 321, name: 'Bank of Peoria'}),
(c3:Company {id: 444, name: 'Consolidated Cans'}),
(d1:Designation {id: 234, title: 'Assistant Clerk'}),
(d2:Designation {id: 345, title: 'Clerk'}),
(d3:Designation {id: 456, title: 'Head Clerk'}),
(e1:Employee {id: 123456789, name: 'Fred Murphy'}),
(c1)<-[:AT]-(j1:Job {started: 123456789})-[:AS]->(d1),
(c2)<-[:AT]-(j2:Job {started: 234567890})-[:AS]->(d2),
(c3)<-[:AT]-(j3:Job {started: 345678901})-[:AS]->(d3),
(e1)-[:HISTORY]->(j3)-[:HISTORY]->(j2)-[:HISTORY]->(j1);
MATCH p=(n)<-[:HISTORY*]-(e1:Employee {id: 123456789})
WHERE NOT ()<-[:HISTORY]-(n)
WITH NODES(p)[0..-1] AS jobs
UNWIND jobs AS job
MATCH (job)-[:AT]->(c)
RETURN c, job.started;
MATCH p=(n)<-[:HISTORY*]-(e1:Employee {id: 123456789})
WHERE NOT ()<-[:HISTORY]-(n)
WITH NODES(p)[0..-1] AS jobs
UNWIND jobs AS job
MATCH (job)-[:AS]->(d)
RETURN d, job.started;
MATCH p=(n)<-[:HISTORY*]-(e1:Employee {id: 123456789})
WHERE NOT ()<-[:HISTORY]-(n)
WITH NODES(p)[0..-1] AS jobs
UNWIND jobs AS job
MATCH (c)<-[:AT]-(job)-[:AS]->(d)
RETURN c, d, job.started;