py2neo如何根据节点的属性检索节点?

时间:2013-10-03 12:05:59

标签: python neo4j py2neo

我找到了相关的方法:

  1. find - 无效,因为此版本的neo4j不支持标签。
  2. match - 不起作用,因为我无法指定关系,因为该节点尚未建立关系。
  3. match_one - 与match相同。
  4. node - 不起作用,因为我不知道节点的ID。
  5. 我需要等同于:

    start n = node(*) where n.name? = "wvxvw" return n;
    

    Cypher查询。似乎它应该是基本的,但它确实不是......

    PS。我反对使用Cypher提出太多理由。所以这也不是一个选择。

4 个答案:

答案 0 :(得分:1)

那么,您应该创建索引以便减少起始节点。这将通过使用标签自动处理,但与此同时,可以解决这个问题。

  1. 创建一个索引,比如说“label”,它将指向您将拥有的不同类型节点的键(在您的情况下,说“人”)
  2. 现在搜索时您可以编写以下查询:

     START n = node:label(key_name='Person') WHERE n.name = 'wvxvw' RETURN n; //key_name is the key's name you will assign while creating the node.
    

答案 1 :(得分:1)

user797257似乎不在游戏中,但我认为这仍然有用:

如果要获取节点,则需要创建索引。 Neo4j中的索引与MySQL或任何其他数据库中的索引相同(如果我理解正确的话)。标签基本上是自动索引,但索引提供了额外的速度。 (我同时使用)。

在某处,或在neo4j本身创建一个索引:

index = graph_db.get_or_create_index(neo4j.Node, "index_name")

然后,像往常一样创建节点,但确实将其添加到索引中:

new_node = batch.create(node({"key":"value"}))
batch.add_indexed_node(index, "key", "value", new_node)

现在,如果您需要找到new_node,请执行以下命令:

 new_node_ref = index.get("key", "value")

返回一个列表。如果您想要/期望单个节点,new_node_ref[0]具有顶部项目。

答案 2 :(得分:1)

使用selector从图中获取节点 以下代码从与搜索

匹配的节点列表中提取第一个节点
selector = NodeSelector(graph)
node = selector.select("Label",key='value')
nodelist=list(node)
m_node=node.first()

答案 3 :(得分:0)

使用py2neo,这个hacky函数将迭代属性和值,并逐渐消除所有与提交的每个条件不匹配的节点。最终结果将是所有(如果有)节点的列表,这些节点匹配所提供的所有属性和标签。

def find_multiProp(graph, *labels, **properties):
    results = None
    for l in labels:
        for k,v in properties.iteritems():
            if results == None:
                genNodes = lambda l,k,v: graph.find(l, property_key=k, property_value=v)
                results = [r for r in genNodes(l,k,v)]
                continue
            prevResults = results
            results = [n for n in genNodes(l,k,v) if n in prevResults]
    return results

请参阅我的other answer创建一个可接受多个属性的merge_one() ...