Neo4j foreach和reduce没有帮助

时间:2018-03-17 08:07:25

标签: neo4j

我正在研究一个公司的数据,其中每个服务请求都有一个ID并涉及其中的各方提供服务,每个参与方都可以是两个角色之一角色一个是服务提供者角色二是服务请求者我是映射此数据的方式是每个节点都有两个List属性,Property 1包含此节点所涉及的所有服务请求ID,另一个List属性是每个特定请求ID(服务提供者或请求者)的给定节点角色。 / p>

示例****:Node1请求服务X此请求具有ID 1 Node2,Node3响应请求ID 1作为服务提供商X

在Node1的List属性ID中保存第一个元素ID1,并且在List属性的第一个元素中的请求者同样发生在Node2和3中,其中ID1保存在其属性ID的第一个元素中,而提供者保存在角色列表的第一个元素中属性所以最终让参与服务请求的各方ID1可以使用此代码

匹配(n:客户端),其中n.id [0] ='1'和n.Role [0] ='请求者' 与n match(m:Client)其中m.id [0] = n.id [0]和m.Role [0] ='Provider' 返回n,m

这适用于单个服务请求但是我想为数百万个请求执行此操作,因此我需要迭代每个n.Nodes(请求者)ID保存,获取List中每个ID值的位置然后搜索相应的List属性Location在m.Nodes(提供者)中使用相同的位置来匹配相同的ID与角色(提供者),因为每个节点可以有许多ID和角色我尝试使用reduce和foreach但是我找不到我想要的东西

1 个答案:

答案 0 :(得分:1)

您需要使用更加面向图形的数据模型。正如您已经意识到的那样,使用列表属性是非常复杂和低效的。

以下是更适合图形数据库的数据模型示例。数据模型针对每个请求的服务具有Service节点,并且针对提供或请求服务的每一方具有Party节点。一方与其提供的每项服务之间存在PROVIDED关系,并且与其请求的每项服务之间存在REQUESTED关系。

以下Cypher查询创建与您的示例场景匹配的节点和关系:

CREATE
  (p1:Party {id: 123}), (p2:Party {id: 234}), (p3:Party {id: 345}),
  (s1:Service {id: 10057}),
  (p1)-[:REQUESTED]->(s1),
  (p2)-[:PROVIDED]->(s1),
  (p3)-[:PROVIDED]->(s1)

以下Cypher查询返回请求者列表以及具有id值10057的服务的任何提供者列表:

MATCH (r:Party)-[:REQUESTED]->(s:Service {id: 10057})
OPTIONAL MATCH (p:Party)-[:PROVIDED]->(s)
RETURN COLLECT(DISTINCT r) AS requesters, COLLECT(DISTINCT p) AS providers;

使用此数据模型(并假设您拥有合理数量的数据),您还应该在:Service(id)上设置index(或uniqueness constraint}来生成MATCH }子句更有效率。