Cypher Query,如果它们具有相同类型的关系,则通过多个节点属性创建一个位置

时间:2012-07-05 02:04:45

标签: neo4j

如果我们有一个与其他节点相关的节点具有相同类型的关系

classmetadata<-INSTANCE_OF-instance(TheNodeINeed)-RELATED_TO->...................

 - ->listype(The owner(name=d,etc))
 - ->listype(The state(name=x,etc))
 - ->listype(The propertie(name=y,etc))
 - ->listype(The location(name=z,etc))

要查找的实例节点,必须按索引中的节点类元数据查找其名称(这很容易)和实例名称(这很容易)以及 listtype .name = ..和 listype .name = ..和 listype .name = ..这就是问题所在:

如果我尝试仅查找名称 MyInstance 实例谁是RELATED_TO 所有者且名称 d ,在这里我只查询一个listype节点没有问题,这个查询工作

START classmetadata = node:classes(name = "MyClassMetadata")
MATCH classmetadata<-[:INSTANCE_OF]-instance-[:RELATED_TO]->listype
WHERE instance.name="MyInstance" and listype.name = "d"
RETURN instance, listype
ORDER BY instance.name ASC skip 0 limit 10

但是,如果我需要查找姓名为主页实例谁是RELATED_TO 所有者,名称 d 并且还与名称 x 相关,并且与 propertyie 相关,名称 y 有一个问题查询结果总是为空的,如果相同类型的关系相关,有没有办法同时过滤两个或三个以上的nodes.properties(listype.name)?

这样的事情不起作用

START classmetadata = node:classes(name = "MyClassMetadata")
MATCH classmetadata<-[:INSTANCE_OF]-instance-[:RELATED_TO]->listype
WHERE instance.name = "MyInstance" AND listype.name = "x"
AND listype.name = "y" AND listype.name="d" RETURN instance, listype
ORDER BY instance.name ASC skip 0 limit 10

2 个答案:

答案 0 :(得分:1)

我为每个关系添加了name属性,以确保我在正确的节点中进行过滤。

START classmetadata = node:classes(name = "MyClassMetadata")
MATCH classmetadata<-[:INSTANCE_OF]-instance-[r1:RELATED_TO]->listype1,
instance-[r2:RELATED_TO]->listype2, 
instance-[r3:RELATED_TO]->listype3 

WHERE instance.name = "MyInstance" AND 
r1.name="state" AND listype1.name = "x" AND 
r2.name="property" AND listype2.name = "y" AND 
r3.name="owner" AND listype3.name="d" 
RETURN instance, listype
ORDER BY instance.name ASC skip 0 limit 10

答案 1 :(得分:0)

所以你想找到listtype的name属性可以是d或x或y的所有列表类型(在你的第一个代码片段中)? 如果是的话,那么 START classmetadata = node:classes(name =“NodeType”) MATCH classmetadata&lt; - [:INSTANCE_OF] -instance - [:RELATED_TO] - &gt; listype WHERE instance.state =“good”和(not(listtype.name in [“d”,“x”,“y”])) RETURN实例,listype ORDER BY instance.name ASC跳过0限制10

您上面的查询也可以正常工作......只需统一引用listtype-不需要listtype1,listtype2等。 START classmetadata = node:classes(name =“NodeType”) MATCH classmetadata&lt; - [:INSTANCE_OF] -instance - [:RELATED_TO] - &gt; listype WHERE instance.state =“good”和AND listype.name! =〜“。 Po。” AND listype.name! =〜“。我。” RETURN实例,listype ORDER BY instance.name ASC跳过0限制10

这就是你要找的东西吗?