2013-11-21 135 views
1

我有DB,我想连接所有具有相同属性的节点。例如:neo4j添加关系到具有相似属性的节点

node("name"="Bob","age":"32") 
node("name"="cherry","age":"32") 

我想在两个节点之间建立关系"age"。它如何完成? 我使用py2neo python模块。 非常感谢!

+1

你在说什么属性或标签?你试过什么了? – jjaderberg

+0

属性,对不起。现在编辑。 – Wumpus

+0

目前还不清楚你想要做什么。你是否想为age:32创建一个节点,并将其他两个节点连接到它? –

回答

1

你的问题是有点模糊,但对于一个非常通用的解决方案,你可以尝试这样的暗号查询(2.0语法)

MATCH n, m 
WHERE n<>m AND n.age = m.age AND NOT (n-[:AGE]->m) 
CREATE n-[r:AGE]->m 
RETURN r 

这将需要每个节点并查找有任何其他节点属性age的值相同,并为该节点创建关系[:AGE]。它检查相关节点是否与其他节点之间没有这种关系,因此,如果再次运行该节点(但它确实在两个方向上创建关系),则不会获得重复,并且还会检查其他节点节点与第一个节点不同,所以它不会创建节点与其自身的关系。如果您想为其他属性执行相同的操作,则只需将该属性名称替换为age并为关系设置不同的类型即可。

由于您没有指定您的要求,我认为这会回答您的问题。你也可以在Python代码中实现这个功能,如果这就是你想要做的,也许你可以展示你到目前为止已经尝试过的东西(你的问题中的代码片段看起来不像是有效的python)。建议可能需要考虑在相关属性上索引节点,因此当您有像(Bob {age:32})这样的节点时,可以查找具有相同年龄值的所有其他节点,遍历结果并创建关系,而不是迭代遍历所有节点每次在数据库中的节点。 Cypher也是如此,标签和索引可以提高真实数据集的性能,但上面的查询说明了可以完成的方法。

+0

非常感谢!这正是我需要的!只有一个小问题,我必须在MATCH(版本1.9)之前使用START,我可以如何忽略不存在属性“年龄”的节点? – Wumpus

+0

阅读“WHERE”的文档,例如http://docs.neo4j.org/chunked/stable/query-where.html#where-property-exists – jjaderberg

相关问题