Cypher查询外部化属性值

时间:2013-09-06 08:34:06

标签: neo4j cypher

在我们的数据模型中,我们将一些域实体值外部化为外部节点。服务对象的模型如下所示:

ref=node(0), 
ref<-[:SERVICE]-subRefNode<-[:SERVICE]-aService-[:HAS_PROPERTY_VALUE]->propValueNode-[:IS_OF_TYPE]->propDefType,
ref<-[:SERVICE]-subRefNode-[:HAS_PROPERTY]->propDefType

节点subRefNode保存与所有服务的关系。服务的所有可能属性都通过ref&lt; - [:SERVICE] -subRefNode - [:HAS_PROPERTY] - &gt; propDefType定义。因此,某个节点可能还没有针对特定属性的propValueNode(例如注释),而其他节点可能只有一个但是空(用户可能已输入注释然后将其清除)。

所以我的问题是如何获得具有空propValueNode.value的节点以及那些还没有propertyValueNode的节点?我想到了类似......

START ref=node(0) MATCH ref<-[:SERVICE]-subRef, aService-[pvRel?:HAS_PROPERTY_VALUE]->propValueNode-[pdRel:IS_OF_TYPE]->propDef<-[:HAS_PROPERTY]-subRef<-[:SERVICE]-aService WHERE (pvRel IS NOT NULL AND propDef.name = 'comment' AND propValueNode.value=~"^$") OR (pvRel IS NULL AND pdRel IS NULL AND propDef.name="comment") RETURN DISTINCT aService.debug

http://console.neo4j.org/r/7zeoay

...但这会错过没有propValueNode的那些。任何提示都表示赞赏!

此致 岸堤

如果http://console.neo4j.org/r/7zeoay不再有效,这是初始图表设置:

start _0 = node(0) with _0 
create
(_1  {type:"SubReferenceNode", name:"SubRef"}),

(_2  {type:"Service", debug:"S0 empty value"}),
(_3  {type:"Service", debug:"S1 missing value node"}),
(_4  {type:"Service", debug:"S2 with value"}),

(_5  {type:"PropertyDefintion", name:"comment"}),
(_6  {type:"PropertyDefintion", name:"name"}),

(_7  {type:"PropertyValue", value:"S0 empty value"}),
(_8  {type:"PropertyValue", value:"S1 missing value node"}),
(_9 {type:"PropertyValue", value:"S2 with value"}),

(_10  {type:"PropertyValue", value:""}),
(_11 {type:"PropertyValue", value:"This is a comment"}),

_0<-[:SERVICE]-_1,
_1<-[:SERVICE]-_2,
_1<-[:SERVICE]-_3,
_1<-[:SERVICE]-_4,

_1-[:HAS_PROPERTY]->_5,
_1-[:HAS_PROPERTY]->_6,

_2-[:HAS_PROPERTY_VALUE]->_7,
_7-[:IS_OF_TYPE]->_6,
_3-[:HAS_PROPERTY_VALUE]->_8,
_8-[:IS_OF_TYPE]->_6,
_4-[:HAS_PROPERTY_VALUE]->_9,
_9-[:IS_OF_TYPE]->_6,

_2-[:HAS_PROPERTY_VALUE]->_10,
_10-[:IS_OF_TYPE]->_5,
_4-[:HAS_PROPERTY_VALUE]->_11,
_11-[:IS_OF_TYPE]->_5    

1 个答案:

答案 0 :(得分:0)

您可以组合两个查询,一个是返回属性为“comment”的空值的服务,另一个返回不具有“comment”类型的属性值的服务,在其他单词,没有任何服务属性值属于“注释”类型。

START ref=node(0) 
MATCH ref<-[:SERVICE]-subRef, aService-[pvRel?:HAS_PROPERTY_VALUE]->propValueNode-[pdRel:IS_OF_TYPE]->propDef<-[:HAS_PROPERTY]-subRef<-[:SERVICE]-aService 
WHERE (pvRel IS NOT NULL AND propDef.name = 'comment' AND propValueNode.value=~"^$") 
RETURN DISTINCT aService.debug
UNION
START ref=node(0)
MATCH ref<-[:SERVICE]-subRef, aService-[pvRel:HAS_PROPERTY_VALUE]->propValueNode-[pdRel:IS_OF_TYPE]->propDef<-[:HAS_PROPERTY]-subRef<-[:SERVICE]-aService
with aService, collect(propDef.name) as propNames
WHERE NONE( propName in propNames where propName = 'comment')
RETURN DISTINCT aService.debug

不使用“UNION”子句的替代解决方案是获取每个服务的所有值节点,并仅返回其值不是“comment”类型的服务或者有一个“comment”类型的值的服务并且值为空,如下面的“Where”子句所示,

START ref=node(0) 
MATCH ref<-[:SERVICE]-subRef, aService-[pvRel:HAS_PROPERTY_VALUE]->propValueNode-[pdRel?:IS_OF_TYPE]->propDef<-[:HAS_PROPERTY]-subRef<-[:SERVICE]-aService 
WHERE propDef.name = 'comment' 
WITH aService, collect(propValueNode) AS valueNodes, propDef 
WHERE NONE (v IN valueNodes 
            WHERE v-[:IS_OF_TYPE]->propDef) OR SINGLE (v IN valueNodes 
                                                       WHERE v.value=~"^$" AND v-[:IS_OF_TYPE]->propDef) 
RETURN aService.debug