Neo4jVectorstore: Parse vectorstore specific parameters in **kwargs when calling add_embeddings()
Labels: name: area: vector store, name: auto:bug, name: auto:improvement

I am trying to use the `add_texts` method on a previously instanciated Neo4jVector object for setting the node_label. 

The scenario is that I am processing different types of text and want to create different nodes accordingly. Because I am handling the database connection somewhere else in my code, I don't want to establish the connection to the database when embedding texts.

```python
[...]
# initialize vector store

self.vector_store = Neo4jVector(
    embedding=self.embeddings_model,
    username=neo4j_config['USER'],
    password=neo4j_config['PASSWORD'],
    url=neo4j_config['URI'],
    database=neo4j_config['DATABASE'],  # neo4j by default
    index_name="vector",  # vector by default
    embedding_node_property="embedding",  # embedding by default
    create_id_index=True,  # True by default
)

[...]

# embed text

created_node = self.vector_store.add_texts(
    [text],
    metadatas=[
        {
            "label": [node_label]
        }
    ],
    embedding=self.embeddings_model,
    node_label=node_label,  # Chunk by default
    text_node_property=text_node_property,  # text by default
)
```

Currently the `node_label` property is overwritten with the default value and not respected when used as a parameter in **kwargs.

https://github.com/langchain-ai/langchain/blob/eb572f41a65c9636b9e0e5a5fb4210a00a67a353/libs/langchain/langchain/vectorstores/neo4j_vector.py#L125

https://github.com/langchain-ai/langchain/blob/eb572f41a65c9636b9e0e5a5fb4210a00a67a353/libs/langchain/langchain/vectorstores/neo4j_vector.py#L450

According to the Docstring, the function is supposed to accept vectorstore specific parameters:

https://github.com/langchain-ai/langchain/blob/eb572f41a65c9636b9e0e5a5fb4210a00a67a353/libs/langchain/langchain/vectorstores/neo4j_vector.py#L458

In order to conform with this, I added this function:

```python
def update_vector_store_properties(self, **kwargs):
    # List of vector store-specific arguments we want to check and potentially update
    vector_store_args = ["node_label", "text_node_property", "embedding_node_property"]

    # Iterate over these arguments
    for arg in vector_store_args:
        # Check if the argument is present in kwargs
        if arg in kwargs:
            # Update the corresponding property of the Neo4jVector instance
            setattr(self, arg, kwargs[arg])
```

I then modified `add_embeddings` like this:

```python
    def add_embeddings(
        self,
        texts: Iterable[str],
        embeddings: List[List[float]],
        metadatas: Optional[List[dict]] = None,
        ids: Optional[List[str]] = None,
        **kwargs: Any,
    ) -> List[str]:
        """Add embeddings to the vectorstore.

        Args:
            texts: Iterable of strings to add to the vectorstore.
            embeddings: List of list of embedding vectors.
            metadatas: List of metadatas associated with the texts.
            kwargs: vectorstore specific parameters
        """
        if ids is None:
            ids = [str(uuid.uuid1()) for _ in texts]

        if not metadatas:
            metadatas = [{} for _ in texts]

        self.update_vector_store_properties(**kwargs)

[...]
```

Don't really know if this is a missing feature or a bug or if I am just using the Vectorstore wrong, but I thought I'd leave this here in case it might be the desired behavior.