Neo4j Cypher模式理解

时间:2017-08-23 08:29:43

标签: neo4j cypher

这是我用于查询测试的Neo4j Sandbox:

Neo4j Browser: https://10-0-1-223-34371.neo4jsandbox.com/

Direct Neo4j HTTP: http://54.89.60.35:34371/browser/

Username: neo4j
Password: capacities-complement-deputies
IP Address: 54.89.60.35
HTTP Port: 34371
Bolt Port: 34370

我有以下Cypher查询:

MATCH (parentD)<-[:DEFINED_BY]-(ch1:Characteristic)<-[v1:HAS_VALUE_ON]-(childD)  
WHERE NOT (ch1)<-[:DEPENDS_ON]-() AND parentD.id = 1 
RETURN v1

正确返回以下数据(1条记录):

{
  "totalHistoryValues": 0,
  "available": true,
  "description": "Integer value 1",
  "value": 10
}

但在以下查询中作为模式理解:

MATCH (parentD)-[:CONTAINS]->(childD:Decision) 
WHERE parentD.id = 1 
WITH * MATCH (childD)-[ru:CREATED_BY]->(u:User) 
OPTIONAL MATCH (childD)-[rup:UPDATED_BY]->(up:User)  
WITH ru, u, rup, up, childD  
SKIP 0 LIMIT 100 
RETURN ru, u, rup, up, childD AS decision, 
[ (parentD)<-[:DEFINED_BY]-(entity)<-[:COMMENTED_ON]-(comg:CommentGroup)-[:COMMENTED_FOR]->(childD)
 | {entityId: toInt(entity.id),  types: labels(entity), totalComments: toInt(comg.totalComments)} ] AS commentGroups, 
[ (parentD)<-[:DEFINED_BY]-(c1)<-[vg1:HAS_VOTE_ON]-(childD)
 | {criterionId: toInt(c1.id),  weight: vg1.avgVotesWeight, totalVotes: toInt(vg1.totalVotes)} ] AS weightedCriteria, 
[ (parentD)<-[:DEFINED_BY]-(ch1:Characteristic)<-[v1:HAS_VALUE_ON]-(childD)  WHERE  NOT ((ch1)<-[:DEPENDS_ON]-()) 
 | {characteristicId: toInt(ch1.id),  value: v1.value, available: v1.available, totalHistoryValues: v1.totalHistoryValues, description: v1.description, valueType: ch1.valueType, visualMode: ch1.visualMode} ] AS valuedCharacteristics, 
[ (childD)-[rdt:BELONGS_TO]->(t:Tag)
 | t ] AS tags

valuedCharacteristics意外包含2个值:

{
  "totalHistoryValues": 0,
  "description": "Integer value 2",
  "valueType": "INTEGER",
  "characteristicId": 2,
  "available": true,
  "visualMode": "INTEGERRANGESLIDER",
  "value": 20
}

,

{
  "totalHistoryValues": 0,
  "description": "Integer value 1",
  "valueType": "INTEGER",
  "characteristicId": 1,
  "available": true,
  "visualMode": "INTEGERRANGESLIDER",
  "value": 10
}

这部分查询出了什么问题:

 [ (parentD)<-[:DEFINED_BY]-(ch1:Characteristic)<-[v1:HAS_VALUE_ON]-(childD)  WHERE  NOT ((ch1)<-[:DEPENDS_ON]-()) 
     | {characteristicId: toInt(ch1.id),  value: v1.value, available: v1.available, totalHistoryValues: v1.totalHistoryValues, description: v1.description, valueType: ch1.valueType, visualMode: ch1.visualMode} ] AS valuedCharacteristics

以及如何修复它以返回正确的单个记录(因为值#2设置为来自另一个父级的特征(id = 2)并且不应该出现在这里)?

1 个答案:

答案 0 :(得分:2)

您应该将parentD传递给WITH中的下一个上下文。由于您未执行此操作,因此模式理解中使用的parentD变量未绑定到parentD.id = 1。因此parentD MATCH是所有可能的节点。将您的查询更改为:

MATCH (parentD)-[:CONTAINS]->(childD:Decision) 
WHERE parentD.id = 1 
WITH * MATCH (childD)-[ru:CREATED_BY]->(u:User) 
OPTIONAL MATCH (childD)-[rup:UPDATED_BY]->(up:User)  
WITH ru, u, rup, up, childD, parentD  
SKIP 0 LIMIT 100 
RETURN ru, u, rup, up, childD AS decision, 
[ (parentD)<-[:DEFINED_BY]-(entity)<-[:COMMENTED_ON]-(comg:CommentGroup)-[:COMMENTED_FOR]->(childD)
 | {entityId: toInt(entity.id),  types: labels(entity), totalComments: toInt(comg.totalComments)} ] AS commentGroups, 
[ (parentD)<-[:DEFINED_BY]-(c1)<-[vg1:HAS_VOTE_ON]-(childD)
 | {criterionId: toInt(c1.id),  weight: vg1.avgVotesWeight, totalVotes: toInt(vg1.totalVotes)} ] AS weightedCriteria, 
[ (parentD)<-[:DEFINED_BY]-(ch1:Characteristic)<-[v1:HAS_VALUE_ON]-(childD)  WHERE  NOT ((ch1)<-[:DEPENDS_ON]-()) 
 | {characteristicId: toInt(ch1.id),  value: v1.value, available: v1.available, totalHistoryValues: v1.totalHistoryValues, description: v1.description, valueType: ch1.valueType, visualMode: ch1.visualMode} ] AS valuedCharacteristics, 
[ (childD)-[rdt:BELONGS_TO]->(t:Tag)
 | t ] AS tags