py2neo 如何基于节点属性检索节点?

5
我找到了相关的方法:
  1. find - 无法使用,因为这个版本的 neo4j 不支持标签。
  2. match - 无法使用,因为我无法指定关系,因为该节点还没有关系。
  3. match_one - 和 match 相同。
  4. node - 无法使用,因为我不知道节点的ID。
我需要一个等价于:
start n = node(*) where n.name? = "wvxvw" return n;

密码查询。看起来很基础,但实际上并不是...

PS. 我反对使用密码查询的原因太多了,所以这也不是一个选项。


所以,如果你不想使用Cypher,也许可以使用服务器插件,参考http://docs.neo4j.org/chunked/milestone/server-plugins.html? - Peter Neubauer
@PeterNeubauer 嗯,如果我要用Java写的话,我会直接嵌入neo4j。我有点希望能在最坏的情况下避免这种麻烦 :) - user797257
@jjaderberg 我将获得不使用Cypher的特权,这将是一种更通用的代码,并且会让我免于处理这种语言的“乐趣” :) 当特征数量较大时,索引是1)费力的,2)非常费力的。通过损坏数据库来解决缺乏适当API的问题并不是一个好主意,至少在一般情况下不是。 - user797257
@wvxvw 我怀疑索引会比绑定数据库中的每个节点并测试属性值更加耗费时间,特别是随着数据库规模的增长。我认为py2neo具有Java API:GlobalGraphOperations的等效物,让你可以获取“所有内容”,但这已经有一段时间了,我假设你已经阅读了文档。 - jjaderberg
@wvxvw,我认为我们的评论是与主题相关的,但如果你对此有强烈感觉,你可以删除你的评论并标记我的评论。我建议你修改你的问题,在其中添加你不想使用索引来检索节点属性值,并且你不想编写自己的服务器扩展。这将增强你的问题,并使得你更有可能获得相关答案。 - jjaderberg
显示剩余2条评论
4个回答

1

使用选择器从图中获取节点。 以下代码从匹配搜索的节点列表中获取第一个节点。

selector = NodeSelector(graph)
node = selector.select("Label",key='value')
nodelist=list(node)
m_node=node.first()

1

好的,你应该创建索引,这样可以减少起始节点。使用标签会自动处理这个问题,但在此期间可能会有解决方法。

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

    START n = node:label(key_name='Person') WHERE n.name = 'wvxvw' RETURN n; //key_name是您在创建节点时分配的键名。
    

1
好的,你用Cypher写了它...这违背了我提出问题的原因+免版税版本的neo4j不允许标签,所以这并不是一个很好的解决方案。 - user797257
答案没有使用标签,而是使用一个名为“label”的索引。关于版税和使用标签,你是什么意思? - jjaderberg
在这个版本的neo4j中,不允许使用语法start x = y:z(...),无论名称如何,但这并不重要,因为我已经可以编写一个满足我的需求的Cypher查询,我根本不想写它。我提出这个问题的原因是想知道是否已经有API可以帮我省去这个工作。 - user797257

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_ref = index.get("key", "value")

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

这段内容现在已经过时,对于py2neo的最新实现。这些函数现在都可以在旧版类中找到。 - Alexander McFarlane

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

请查看我的其他答案,了解如何创建一个merge_one()函数,该函数可以接受多个属性...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接