1

私のクエリの意図は、同様の単語をマークすることです。

CREATE CONSTRAINT ON (n:Word) ASSERT n.title IS UNIQUE

MATCH (n) WHERE ID(n)={id} 
MERGE (o:Word{title:{title}}) 
WITH n,o MERGE n-[r:SIMILAR{location:'{location}'}]->o 
RETURN ID(o)

nは既存の単語です。oまだ存在しない場合は、関係と他の単語 ( ) を作成したいと思います。

このクエリの問題は、1 つのタイトルで機能することですが、タイトルで配列を使用すると、Word のタイトルがo配列全体になります。

同じことを行う別のクエリ、および/またはタイトルに複数の値を渡す方法を提案できますか。

Rails で Neography Gem (REST API など) を使用しています。

4

1 に答える 1

2

パラメータ配列で個々の値を使用するにはFOREACH、次のようなものを使用できます

MATCH (n)
WHERE ID (n) = {id}
FOREACH (t IN {title} |
    MERGE (o:Word {title:t})
    MERGE n-[:SIMILAR]->o
)

パラメーターとしても渡したい場合location(実際には現在のクエリの文字列リテラルです)、パラメーター配列のntitle, locationペアに対してマージ操作が発生するようにするには、試してください。

FOREACH (map IN {maps} |
    MERGE (o:Word {title:map.title})
    MERGE n-[:SIMILAR {location:map.location}]->o
)

次のようなパラメータで

{
    "maps": [
        {
            "title":"neography",
            "location":"1.."
        },{
            "title":"coreography",
            "location":"3.."
        }
    ]
}

その他の提案:

  1. 通常、パラメータから内部 ID でノードを検索するのはあまりよくありません。場合によっては、クエリをチェーンしても問題ない場合がありますが、ほとんどの場合、ラベル インデックス ルックアップの方が優れています。MATCH (n:Word {title:"geography"})
  2. トランザクション暗号エンドポイントを使用していない場合は、試してみてください。その後、1 つのトランザクション内の各呼び出しで 1 つ以上のクエリを使用して 1 つ以上の呼び出しを行うことができます。パフォーマンスが向上し、より複雑なパラメーター オブジェクトを送信する必要がなくなり、単純なクエリを多数送信できるようになる場合があります。
于 2014-04-19T06:37:19.980 に答える